From 400c82d9b5f817bf92941431f2450d9a48f015ad Mon Sep 17 00:00:00 2001 From: Thibaut Cholley Date: Thu, 26 Feb 2026 15:09:55 +0100 Subject: [PATCH] fix: give input class if used on deserialize --- src/State/Provider/DeserializeProvider.php | 3 ++- .../Provider/DeserializeProviderTest.php | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/State/Provider/DeserializeProvider.php b/src/State/Provider/DeserializeProvider.php index 6390c86bcd0..2f3987e3d47 100644 --- a/src/State/Provider/DeserializeProvider.php +++ b/src/State/Provider/DeserializeProvider.php @@ -100,7 +100,8 @@ public function provide(Operation $operation, array $uriVariables = [], array $c unset($serializerContext[SerializerContextBuilderInterface::ASSIGN_OBJECT_TO_POPULATE]); try { - $data = $this->serializer->deserialize((string) $request->getContent(), $serializerContext['deserializer_type'] ?? $operation->getClass(), $format, $serializerContext); + $class = $operation->getInput()['class'] ?? $operation->getClass(); + $data = $this->serializer->deserialize((string) $request->getContent(), $serializerContext['deserializer_type'] ?? $class, $format, $serializerContext); } catch (PartialDenormalizationException $e) { if (!class_exists(ConstraintViolationList::class)) { throw $e; diff --git a/src/State/Tests/Provider/DeserializeProviderTest.php b/src/State/Tests/Provider/DeserializeProviderTest.php index b0f29c11413..03eee30a3f0 100644 --- a/src/State/Tests/Provider/DeserializeProviderTest.php +++ b/src/State/Tests/Provider/DeserializeProviderTest.php @@ -232,4 +232,23 @@ public function testDeserializeDoesNotSetObjectToPopulateWhenContextIsFalse(): v $request->attributes->set('input_format', 'format'); $provider->provide($operation, ['id' => 1], ['request' => $request]); } + + public function testDeserializeWithInputClass(): void + { + $serializerContext = []; + $operation = new Post(deserialize: true, class: \stdClass::class, input: ['class' => 'InputClass']); + $decorated = $this->createStub(ProviderInterface::class); + $decorated->method('provide')->willReturn(null); + + $serializerContextBuilder = $this->createMock(SerializerContextBuilderInterface::class); + $serializerContextBuilder->expects($this->once())->method('createFromRequest')->willReturn($serializerContext); + $serializer = $this->createMock(SerializerInterface::class); + $serializer->expects($this->once())->method('deserialize')->with('test', 'InputClass', 'format', ['uri_variables' => ['id' => 1]] + $serializerContext)->willReturn(new \stdClass()); + + $provider = new DeserializeProvider($decorated, $serializer, $serializerContextBuilder); + $request = new Request(content: 'test'); + $request->headers->set('CONTENT_TYPE', 'ok'); + $request->attributes->set('input_format', 'format'); + $provider->provide($operation, ['id' => 1], ['request' => $request]); + } }