Skip to content

Commit 480b1ca

Browse files
author
Thibaut Cholley
committed
fix: give input class if used on deserialize
1 parent c741bd6 commit 480b1ca

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/State/Provider/DeserializeProvider.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
100100
unset($serializerContext[SerializerContextBuilderInterface::ASSIGN_OBJECT_TO_POPULATE]);
101101

102102
try {
103-
$data = $this->serializer->deserialize((string) $request->getContent(), $serializerContext['deserializer_type'] ?? $operation->getClass(), $format, $serializerContext);
103+
$class = $operation->getInput()['class'] ?? $operation->getClass();
104+
$data = $this->serializer->deserialize((string) $request->getContent(), $serializerContext['deserializer_type'] ?? $class, $format, $serializerContext);
104105
} catch (PartialDenormalizationException $e) {
105106
if (!class_exists(ConstraintViolationList::class)) {
106107
throw $e;

src/State/Tests/Provider/DeserializeProviderTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,23 @@ public function testDeserializeDoesNotSetObjectToPopulateWhenContextIsFalse(): v
232232
$request->attributes->set('input_format', 'format');
233233
$provider->provide($operation, ['id' => 1], ['request' => $request]);
234234
}
235+
236+
public function testDeserializeWithInputClass(): void
237+
{
238+
$serializerContext = [];
239+
$operation = new Post(deserialize: true, class: \stdClass::class, input: ['class' => 'InputClass']);
240+
$decorated = $this->createStub(ProviderInterface::class);
241+
$decorated->method('provide')->willReturn(null);
242+
243+
$serializerContextBuilder = $this->createMock(SerializerContextBuilderInterface::class);
244+
$serializerContextBuilder->expects($this->once())->method('createFromRequest')->willReturn($serializerContext);
245+
$serializer = $this->createMock(SerializerInterface::class);
246+
$serializer->expects($this->once())->method('deserialize')->with('test', 'InputClass', 'format', ['uri_variables' => ['id' => 1]] + $serializerContext)->willReturn(new \stdClass());
247+
248+
$provider = new DeserializeProvider($decorated, $serializer, $serializerContextBuilder);
249+
$request = new Request(content: 'test');
250+
$request->headers->set('CONTENT_TYPE', 'ok');
251+
$request->attributes->set('input_format', 'format');
252+
$provider->provide($operation, ['id' => 1], ['request' => $request]);
253+
}
235254
}

0 commit comments

Comments
 (0)