Skip to content

Commit cceb83b

Browse files
Merge branch '6.4' into 7.3
* 6.4: [HttpKernel] Fix using MapRequestPayload on nullable arguments [DependencyInjection] Fix preloading LazyClosure [Emoji] Update list to version 17 [HttpClient] Don't reset unused clients in data collector
2 parents c373a44 + 8b41a8c commit cceb83b

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

Controller/ArgumentResolver/RequestPayloadValueResolver.php

Lines changed: 6 additions & 6 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,12 +211,8 @@ private function mapRequestPayload(Request $request, ArgumentMetadata $argument,
207211
$type = $argument->getType();
208212
}
209213

210-
if ($data = $request->request->all()) {
211-
return $this->serializer->denormalize($data, $type, 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ('form' === $format ? ['filter_bool' => true] : []));
212-
}
213-
214-
if ('' === ($data = $request->getContent()) && ($argument->isNullable() || $argument->hasDefaultValue())) {
215-
return null;
214+
if (\is_array($data)) {
215+
return $this->serializer->denormalize($data, $type, 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE);
216216
}
217217

218218
if ('form' === $format) {

Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php

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

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

0 commit comments

Comments
 (0)