8000 feature #50082 [HttpKernel] Enhance MapQueryString adding validation … · symfony/symfony@eece9de · GitHub
[go: up one dir, main page]

Skip to content

Commit eece9de

Browse files
committed
feature #50082 [HttpKernel] Enhance MapQueryString adding validation group (renanbr)
This PR was merged into the 6.3 branch. Discussion ---------- [HttpKernel] Enhance MapQueryString adding validation group | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | no | New feature? | yes | Deprecations? | no | Tickets | continuity of #50029 and #49138 | License | MIT | Doc PR | n/a - Introduces `$validationGroups` property to the `MapQueryString` attribute to work as same as in `MapRequestPayload` - Renames `MapQueryString` property `$context` to `$serializationContext` to harmonize with `MapRequestPayload` ```php # src/Controller/HelloController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Attribute\AsController; use Symfony\Component\HttpKernel\Attribute\MapQueryString; use Symfony\Component\Routing\Annotation\Route; #[AsController] final class HelloController { #[Route('/hello', methods: ['GET'])] public function __invoke( #[MapQueryString(validationGroups: 'strict')] MyObject $object, ): Response { // ... } } ``` Commits ------- 8aad8b9 [HttpKernel] Enhance MapQueryString adding validation group
2 parents 5ef2cd5 + 8aad8b9 commit eece9de

File tree

3 files changed

+38
-11
lines changed

3 files changed

+38
-11
lines changed

src/Symfony/Component/HttpKernel/Attribute/MapQueryString.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\HttpKernel\Attribute;
1313

1414
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestPayloadValueResolver;
15+
use Symfony\Component\Validator\Constraints\GroupSequence;
1516

1617
/**
1718
* Controller parameter tag to map the query string of the request to typed object and validate it.
@@ -22,7 +23,8 @@
2223
class MapQueryString extends ValueResolver
2324
{
2425
public function __construct(
25-
public readonly array $context = [],
26+
public readonly array $serializationContext = [],
27+
public readonly string|GroupSequence|array|null $validationGroups = null,
2628
string $resolver = RequestPayloadValueResolver::class,
2729
) {
2830
parent::__construct($resolver);

src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ private function mapQueryString(Request $request, string $type, MapQueryString $
120120
return null;
121121
}
122122

123-
return $this->serializer->denormalize($data, $type, null, se 10000 lf::CONTEXT_DENORMALIZE + $attribute->context);
123+
return $this->serializer->denormalize($data, $type, null, self::CONTEXT_DENORMALIZE + $attribute->serializationContext);
124124
}
125125

126126
private function mapRequestPayload(Request $request, string $type, MapRequestPayload $attribute): ?object

src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\HttpFoundation\Request;
1616
use Symfony\Component\HttpKernel\Attribute\MapQueryString;
1717
use Symfony\Component\HttpKernel\Attribute\MapRequestPayload;
18+
use Symfony\Component\HttpKernel\Attribute\ValueResolver;
1819
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestPayloadValueResolver;
1920
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
2021
use Symfony\Component\HttpKernel\Exception\HttpException;
@@ -312,7 +313,7 @@ public static function provideMismatchedFormatContext(): iterable
312313
/**
313314
* @dataProvider provideValidationGroupsOnManyTypes
314315
*/
315-
public function testValidationGroupsPassed(mixed $groups)
316+
public function testValidationGroupsPassed(string $method, ValueResolver $attribute)
316317
{
317318
$input = ['price' => '50', 'title' => 'A long title, so the validation passes'];
318319

@@ -323,10 +324,10 @@ public function testValidationGroupsPassed(mixed $groups)
323324
$validator = (new ValidatorBuilder())->enableAnnotationMapping()->getValidator();
324325
$resolver = new RequestPayloadValueResolver($serializer, $validator);
325326

326-
$request = Request::create('/', 'POST', $input);
327+
$request = Request::create('/', $method, $input);
327328

328329
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, false, null, false, [
329-
MapRequestPayload::class => new MapRequestPayload(validationGroups: $groups),
330+
$attribute::class => $attribute,
330331
]);
331332

332333
$resolved = $resolver->resolve($request, $argument);
@@ -338,7 +339,7 @@ public function testValidationGroupsPassed(mixed $groups)
338339
/**
339340
* @dataProvider provideValidationGroupsOnManyTypes
340341
*/
341-
public function testValidationGroupsNotPassed(mixed $groups)
342+
public function testValidationGroupsNotPassed(string $method, ValueResolver $attribute)
342343
{
343344
$input = ['price' => '50', 'title' => 'Too short'];
344345

@@ -347,9 +348,9 @@ public function testValidationGroupsNotPassed(mixed $groups)
347348
$resolver = new RequestPayloadValueResolver($serializer, $validator);
348349

349350
$argument = new ArgumentMetadata('valid', RequestPayload::class, false, false, null, false, [
350-
MapRequestPayload::class => new MapRequestPayload(validationGroups: $groups),
351+
$attribute::class => $attribute,
351352
]);
352-
$request = Request::create('/', 'POST', $input);
353+
$request = Request::create('/', $method, $input);
353354

354355
try {
355356
$resolver->resolve($request, $argument);
@@ -364,11 +365,35 @@ public function testValidationGroupsNotPassed(mixed $groups)
364365

365366
public static function provideValidationGroupsOnManyTypes(): iterable
366367
{
367-
yield 'validation group as string' => ['strict'];
368+
yield 'request payload with validation group as string' => [
369+
'POST',
370+
new MapRequestPayload(validationGroups: 'strict'),
371+
];
368372

369-
yield 'validation group as array' => [['strict']];
373+
yield 'request payload with validation group as array' => [
374+
'POST',
375+
new MapRequestPayload(validationGroups: ['strict']),
376+
];
377+
378+
yield 'request payload with validation group as GroupSequence' => [
379+
'POST',
380+
new MapRequestPayload(validationGroups: new Assert\GroupSequence(['strict'])),
381+
];
370382

371-
yield 'validation group as GroupSequence' => [new Assert\GroupSequence(['strict'])];
383+
yield 'query with validation group as string' => [
384+
'GET',
385+
new MapQueryString(validationGroups: 'strict'),
386+
];
387+
388+
yield 'query with validation group as array' => [
389+
'GET',
390+
new MapQueryString(validationGroups: ['strict']),
391+
];
392+
393+
yield 'query with validation group as GroupSequence' => [
394+
'GET',
395+
new MapQueryString(validationGroups: new Assert\GroupSequence(['strict'])),
396+
];
372397
}
373398
}
374399

0 commit comments

Comments
 (0)
0