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 574cac3

Browse filesBrowse files
committed
bug #52891 [HttpKernel] Fix request attribute value ignored with pinned resolvers (HypeMC)
This PR was merged into the 6.3 branch. Discussion ---------- [HttpKernel] Fix request attribute value ignored with pinned resolvers | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | Fix #52875 | License | MIT This is similar to #50458. When pinned resolvers are used, values already resolved in the request attributes bag are ignored. Commits ------- dd725be [HttpKernel] Fix request attribute value ignored with pinned resolvers
2 parents 89b09df + dd725be commit 574cac3
Copy full SHA for 574cac3

File tree

2 files changed

+45
-5
lines changed
Filter options

2 files changed

+45
-5
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Controller/ArgumentResolver.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public function getArguments(Request $request, callable $controller, \Reflection
7373

7474
$argumentValueResolvers = [
7575
$this->namedResolvers->get($resolverName),
76+
new RequestAttributeValueResolver(),
7677
new DefaultValueResolver(),
7778
];
7879
}

‎src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolverTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolverTest.php
+44-5Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
2323
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
2424
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
25+
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
26+
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
2527
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
2628
use Symfony\Component\HttpKernel\Exception\ResolverNotFoundException;
2729
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingRequest;
@@ -298,24 +300,39 @@ public function testTargetedResolver()
298300

299301
public function testTargetedResolverWithDefaultValue()
300302
{
301-
$resolver = self::getResolver([], [RequestAttributeValueResolver::class => new RequestAttributeValueResolver()]);
303+
$resolver = self::getResolver([], [TestEntityValueResolver::class => new TestEntityValueResolver()]);
302304

303305
$request = Request::create('/');
304306
$controller = $this->controllerTargetingResolverWithDefaultValue(...);
305307

306-
$this->assertSame([2], $resolver->getArguments($request, $controller));
308+
/** @var Post[] $arguments */
309+
$arguments = $resolver->getArguments($request, $controller);
310+
311+
$this->assertCount(1, $arguments);
312+
$this->assertSame('Default', $arguments[0]->title);
307313
}
308314

309315
public function testTargetedResolverWithNullableValue()
310316
{
311-
$resolver = self::getResolver([], [RequestAttributeValueResolver::class => new RequestAttributeValueResolver()]);
317+
$resolver = self::getResolver([], [TestEntityValueResolver::class => new TestEntityValueResolver()]);
312318

313319
$request = Request::create('/');
314320
$controller = $this->controllerTargetingResolverWithNullableValue(...);
315321

316322
$this->assertSame([null], $resolver->getArguments($request, $controller));
317323
}
318324

325+
public function testTargetedResolverWithRequestAttributeValue()
326+
{
327+
$resolver = self::getResolver([], [TestEntityValueResolver::class => new TestEntityValueResolver()]);
328+
329+
$request = Request::create('/');
330+
$request->attributes->set('foo', $object = new Post('Random '.time()));
331+
$controller = $this->controllerTargetingResolverWithTestEntity(...);
332+
333+
$this->assertSame([$object], $resolver->getArguments($request, $controller));
334+
}
335+
319336
public function testDisabledResolver()
320337
{
321338
$resolver = self::getResolver(namedResolvers: []);
@@ -393,11 +410,15 @@ public function controllerTargetingResolver(#[ValueResolver(DefaultValueResolver
393410
{
394411
}
395412

396-
public function controllerTargetingResolverWithDefaultValue(#[ValueResolver(RequestAttributeValueResolver::class)] int $foo = 2)
413+
public function controllerTargetingResolverWithDefaultValue(#[ValueResolver(TestEntityValueResolver::class)] Post $foo = new Post('Default'))
414+
{
415+
}
416+
417+
public function controllerTargetingResolverWithNullableValue(#[ValueResolver(TestEntityValueResolver::class)] ?Post $foo)
397418
{
398419
}
399420

400-
public function controllerTargetingResolverWithNullableValue(#[ValueResolver(RequestAttributeValueResolver::class)] ?int $foo)
421+
public function controllerTargetingResolverWithTestEntity(#[ValueResolver(TestEntityValueResolver::class)] Post $foo)
401422
{
402423
}
403424

@@ -422,3 +443,21 @@ public function controllerTargetingUnknownResolver(
422443
function controller_function($foo, $foobar)
423444
{
424445
}
446+
447+
class TestEntityValueResolver implements ValueResolverInterface
448+
{
449+
public function resolve(Request $request, ArgumentMetadata $argument): iterable
450+
{
451+
return Post::class === $argument->getType() && $request->request->has('title')
452+
? [new Post($request->request->get('title'))]
453+
: [];
454+
}
455+
}
456+
457+
class Post
458+
{
459+
public function __construct(
460+
public readonly string $title,
461+
) {
462+
}
463+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.