Skip to content

Commit 9fbc7d9

Browse files
Merge branch '7.4' into 8.0
* 7.4: [FrameworkBundle] Dump all registered extensions’ configuration reference fix merge Mark FormFlow as finished if the last step is skipped [HttpKernel] Fix using MapRequestPayload on nullable arguments [ObjectMapper] bypass lazy ghost with class transform [WebProfilerBundle] fix displaying runner [DependencyInjection] Fix preloading LazyClosure [Emoji] Update list to version 17 make doLoadClassMetadata() methods private fix routing config type information [HttpClient] Don't reset unused clients in data collector
2 parents 550decc + 33b8538 commit 9fbc7d9

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

Controller/ArgumentResolver/RequestPayloadValueResolver.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,10 @@ private function mapQueryString(Request $request, ArgumentMetadata $argument, Ma
193193

194194
private function mapRequestPayload(Request $request, ArgumentMetadata $argument, MapRequestPayload $attribute): object|array|null
195195
{
196+
if ('' === ($data = $request->request->all() ?: $request->getContent()) && ($argument->isNullable() || $argument->hasDefaultValue())) {
197+
return null;
198+
}
199+
196200
if (null === $format = $request->getContentTypeFormat()) {
197201
throw new UnsupportedMediaTypeHttpException('Unsupported format.');
198202
}
@@ -207,14 +211,10 @@ private function mapRequestPayload(Request $request, ArgumentMetadata $argument,
207211
$type = $argument->getType();
208212
}
209213

210-
if ($data = $request->request->all()) {
214+
if (\is_array($data)) {
211215
return $this->serializer->denormalize($data, $type, 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ('form' === $format ? ['filter_bool' => true] : []));
212216
}
213217

214-
if ('' === ($data = $request->getContent()) && ($argument->isNullable() || $argument->hasDefaultValue())) {
215-
return null;
216-
}
217-
218218
if ('form' === $format) {
219219
throw new BadRequestHttpException('Request payload contains invalid "form" data.');
220220
}

Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,28 @@ public function testNullPayloadAndNotDefaultOrNullableArgument()
182182
}
183183
}
184184

185+
public function testRequestPayloadWithoutContentTypeOnNullableArgumentReturnsNull()
186+
{
187+
$validator = $this->createMock(ValidatorInterface::class);
188+
$validator->expects($this->never())
189+
->method('validate');
190+
191+
$resolver = new RequestPayloadValueResolver(new Serializer(), $validator);
192+
193+
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, false, null, true, [
194+
MapRequestPayload::class => new MapRequestPayload(),
195+
]);
196+
$request = Request::create('/', 'POST');
197+
198+
$kernel = $this->createMock(HttpKernelInterface::class);
199+
$arguments = $resolver->resolve($request, $argument);
200+
$event = new ControllerArgumentsEvent($kernel, fn () => null, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
201+
202+
$resolver->onKernelControllerArguments($event);
203+
204+
$this->assertSame([null], $event->getArguments());
205+
}
206+
185207
public function testQueryNullPayloadAndNotDefaultOrNullableArgument()
186208
{
187209
$validator = $this->createMock(ValidatorInterface::class);

0 commit comments

Comments
 (0)