Skip to content

Commit ec3423a

Browse files
committed
Merge branch '6.4' into 7.1
* 6.4: [BeanstalkMessenger] Round delay to an integer to avoid deprecation warning [PropertyInfo] Fix interface handling in `PhpStanTypeHelper` [HttpClient] Test POST to GET redirects [HttpKernel] Denormalize request data using the csv format when using "#[MapQueryString]" or "#[MapRequestPayload]" (except for content data) fix: preserve and nowrap in profiler code highlighting
2 parents 451a858 + 661cb10 commit ec3423a

File tree

2 files changed

+67
-4
lines changed

2 files changed

+67
-4
lines changed

Controller/ArgumentResolver/RequestPayloadValueResolver.php

+2-4
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,9 @@
4646
class RequestPayloadValueResolver implements ValueResolverInterface, EventSubscriberInterface
4747
{
4848
/**
49-
* @see \Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT
5049
* @see DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS
5150
*/
5251
private const CONTEXT_DENORMALIZE = [
53-
'disable_type_enforcement' => true,
5452
'collect_denormalization_errors' => true,
5553
];
5654

@@ -189,7 +187,7 @@ private function mapQueryString(Request $request, ArgumentMetadata $argument, Ma
189187
return null;
190188
}
191189

192-
return $this->serializer->denormalize($data, $argument->getType(), null, $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ['filter_bool' => true]);
190+
return $this->serializer->denormalize($data, $argument->getType(), 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ['filter_bool' => true]);
193191
}
194192

195193
private function mapRequestPayload(Request $request, ArgumentMetadata $argument, MapRequestPayload $attribute): object|array|null
@@ -209,7 +207,7 @@ private function mapRequestPayload(Request $request, ArgumentMetadata $argument,
209207
}
210208

211209
if ($data = $request->request->all()) {
212-
return $this->serializer->denormalize($data, $type, null, $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ('form' === $format ? ['filter_bool' => true] : []));
210+
return $this->serializer->denormalize($data, $type, 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ('form' === $format ? ['filter_bool' => true] : []));
213211
}
214212

215213
if ('' === $data = $request->getContent()) {

Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php

+65
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Symfony\Component\HttpKernel\Exception\HttpException;
2323
use Symfony\Component\HttpKernel\Exception\NearMissValueResolverException;
2424
use Symfony\Component\HttpKernel\HttpKernelInterface;
25+
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
2526
use Symfony\Component\Serializer\Encoder\JsonEncoder;
2627
use Symfony\Component\Serializer\Encoder\XmlEncoder;
2728
use Symfony\Component\Serializer\Exception\NotNormalizableValueException;
@@ -395,6 +396,38 @@ public function testQueryStringValidationPassed()
395396
$this->assertEquals([$payload], $event->getArguments());
396397
}
397398

399+
public function testQueryStringParameterTypeMismatch()
400+
{
401+
$query = ['price' => 'not a float'];
402+
403+
$normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());
404+
$serializer = new Serializer([$normalizer], ['json' => new JsonEncoder()]);
405+
406+
$validator = $this->createMock(ValidatorInterface::class);
407+
$validator->expects($this->never())->method('validate');
408+
409+
$resolver = new RequestPayloadValueResolver($serializer, $validator);
410+
411+
$argument = new ArgumentMetadata('invalid', RequestPayload::class, false, false, null, false, [
412+
MapQueryString::class => new MapQueryString(),
413+
]);
414+
415+
$request = Request::create('/', 'GET', $query);
416+
417+
$kernel = $this->createMock(HttpKernelInterface::class);
418+
$arguments = $resolver->resolve($request, $argument);
419+
$event = new ControllerArgumentsEvent($kernel, function () {}, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
420+
421+
try {
422+
$resolver->onKernelControllerArguments($event);
423+
$this->fail(sprintf('Expected "%s" to be thrown.', HttpException::class));
424+
} catch (HttpException $e) {
425+
$validationFailedException = $e->getPrevious();
426+
$this->assertInstanceOf(ValidationFailedException::class, $validationFailedException);
427+
$this->assertSame('This value should be of type float.', $validationFailedException->getViolations()[0]->getMessage());
428+
}
429+
}
430+
398431
public function testRequestInputValidationPassed()
399432
{
400433
$input = ['price' => '50'];
@@ -457,6 +490,38 @@ public function testRequestArrayDenormalization()
457490
$this->assertEquals([$payload], $event->getArguments());
458491
}
459492

493+
public function testRequestInputTypeMismatch()
494+
{
495+
$input = ['price' => 'not a float'];
496+
497+
$normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());
498+
$serializer = new Serializer([$normalizer], ['json' => new JsonEncoder()]);
499+
500+
$validator = $this->createMock(ValidatorInterface::class);
501+
$validator->expects($this->never())->method('validate');
502+
503+
$resolver = new RequestPayloadValueResolver($serializer, $validator);
504+
505+
$argument = new ArgumentMetadata('invalid', RequestPayload::class, false, false, null, false, [
506+
MapRequestPayload::class => new MapRequestPayload(),
507+
]);
508+
509+
$request = Request::create('/', 'POST', $input);
510+
511+
$kernel = $this->createMock(HttpKernelInterface::class);
512+
$arguments = $resolver->resolve($request, $argument);
513+
$event = new ControllerArgumentsEvent($kernel, function () {}, $arguments, $request, HttpKernelInterface::MAIN_REQUEST);
514+
515+
try {
516+
$resolver->onKernelControllerArguments($event);
517+
$this->fail(sprintf('Expected "%s" to be thrown.', HttpException::class));
518+
} catch (HttpException $e) {
519+
$validationFailedException = $e->getPrevious();
520+
$this->assertInstanceOf(ValidationFailedException::class, $validationFailedException);
521+
$this->assertSame('This value should be of type float.', $validationFailedException->getViolations()[0]->getMessage());
522+
}
523+
}
524+
460525
public function testItThrowsOnMissingAttributeType()
461526
{
462527
$serializer = new Serializer();

0 commit comments

Comments
 (0)