Skip to content

Commit 574cac3

Browse files
committed
bug symfony#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 symfony#52875 | License | MIT This is similar to symfony#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

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

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

+1
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

+44-5
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)