Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 8aad8b9

Browse filesBrowse files
committed
[HttpKernel] Enhance MapQueryString adding validation group
1 parent cb1f853 commit 8aad8b9
Copy full SHA for 8aad8b9

File tree

3 files changed

+38
-11
lines changed
Filter options

3 files changed

+38
-11
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Attribute/MapQueryString.php
+3-1Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php
+1-1Lines 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, self::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

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php
+34-9Lines 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)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.