Skip to content

Commit 998e944

Browse files
committed
[HttpKernel] Add #[ValueResolver] for specifying a parameter argument resolver
1 parent 1f7bc10 commit 998e944

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\HttpKernel\Attribute;
13+
14+
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
15+
16+
#[\Attribute(\Attribute::TARGET_PARAMETER)]
17+
class ValueResolver
18+
{
19+
/** @param class-string<ValueResolverInterface> $class */
20+
public function __construct(
21+
public readonly string $class
22+
) {
23+
}
24+
}

src/Symfony/Component/HttpKernel/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ CHANGELOG
99
* Add `#[WithHttpStatus]` for defining status codes for exceptions
1010
* Use an instance of `Psr\Clock\ClockInterface` to generate the current date time in `DateTimeValueResolver`
1111
* Add `#[WithLogLevel]` for defining log levels for exceptions
12+
* Add `#[ValueResolver]` for specifying a parameter argument resolver
1213

1314
6.2
1415
---

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
namespace Symfony\Component\HttpKernel\Controller;
1313

14+
use Psr\Container\ContainerInterface;
1415
use Symfony\Component\HttpFoundation\Request;
16+
use Symfony\Component\HttpKernel\Attribute\ValueResolver;
1517
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
1618
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
1719
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver;
@@ -45,7 +47,15 @@ public function getArguments(Request $request, callable $controller, \Reflection
4547
$arguments = [];
4648

4749
foreach ($this->argumentMetadataFactory->createArgumentMetadata($controller, $reflector) as $metadata) {
50+
if ($attributes = $metadata->getAttributesOfType(ValueResolver::class)) {
51+
$resolverClass = reset($attributes)->class;
52+
}
53+
4854
foreach ($this->argumentValueResolvers as $resolver) {
55+
if ($resolver::class !== ($resolverClass ?? $resolver::class)) {
56+
continue;
57+
}
58+
4959
if ((!$resolver instanceof ValueResolverInterface || $resolver instanceof TraceableValueResolver) && !$resolver->supports($request, $metadata)) {
5060
continue;
5161
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Symfony\Component\HttpFoundation\Session\Session;
1717
use Symfony\Component\HttpFoundation\Session\SessionInterface;
1818
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
19+
use Symfony\Component\HttpKernel\Attribute\ValueResolver;
1920
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
2021
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
2122
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
@@ -283,6 +284,15 @@ public function testGetSessionMissMatchOnNull()
283284
self::$resolver->getArguments($request, $controller);
284285
}
285286

287+
public function testValueResolverAttribute()
288+
{
289+
$request = Request::create('/');
290+
$request->attributes->set('foo', 'foo');
291+
$controller = [new self(), 'controllerWithAttribute'];
292+
293+
$this->assertEquals(['foo'], self::$resolver->getArguments($request, $controller));
294+
}
295+
286296
public function __invoke($foo, $bar = null)
287297
{
288298
}
@@ -322,6 +332,10 @@ public function controllerWithSessionInterface(SessionInterface $session)
322332
public function controllerWithExtendingSession(ExtendingSession $session)
323333
{
324334
}
335+
336+
public function controllerWithAttribute(#[ValueResolver(RequestAttributeValueResolver::class)] $foo = 'bar')
337+
{
338+
}
325339
}
326340

327341
function controller_function($foo, $foobar)

0 commit comments

Comments
 (0)