Skip to content

Commit 8b3db48

Browse files
feature #48992 [HttpKernel] Introduce pinnable value resolvers with #[ValueResolver] and #[AsPinnedValueResolver] (MatTheCat)
This PR was merged into the 6.3 branch. Discussion ---------- [HttpKernel] Introduce pinnable value resolvers with `#[ValueResolver]` and `#[AsPinnedValueResolver]` | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | no | New feature? | yes | Deprecations? | no | Tickets | Fix #48927 | License | MIT | Doc PR | symfony/symfony-docs#17763 Introducing a new `ValueResolver` attribute, which allows to - “pin” a value resolver to an argument, meaning only said resolver will be called - prevent a resolver to be called for an argument Every existing resolver-related attribute (`MapEntity`, `CurrentUser`…) now extends `ValueResolver`. Each `controller.argument_value_resolver` tag is added a `name` attribute, which is the resolver’s FQCN. This is the first argument `ValueResolver` expects. A new `AsPinnedValueResolver` attribute is added for autoconfiguration, adding the `controller.pinned_value_resolver` tag. Such resolvers can only be “pinned”, meaning they won’t ever be called for an argument missing the `ValueResolver` attribute. Commits ------- 245485c2a7 [HttpKernel] Introduce pinnable value resolvers with `#[ValueResolver]` and `#[AsPinnedValueResolver]`
2 parents 0888844 + ffb70f8 commit 8b3db48

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

DependencyInjection/FrameworkExtension.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
use Symfony\Component\HttpClient\UriTemplateHttpClient;
8484
use Symfony\Component\HttpFoundation\Request;
8585
use Symfony\Component\HttpKernel\Attribute\AsController;
86+
use Symfony\Component\HttpKernel\Attribute\AsPinnedValueResolver;
8687
use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
8788
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
8889
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\BackedEnumValueResolver;
@@ -691,6 +692,10 @@ public function load(array $configs, ContainerBuilder $container)
691692
$definition->addTag('messenger.message_handler', $tagAttributes);
692693
});
693694

695+
$container->registerAttributeForAutoconfiguration(AsPinnedValueResolver::class, static function (ChildDefinition $definition, AsPinnedValueResolver $attribute): void {
696+
$definition->addTag('controller.pinned_value_resolver', $attribute->name ? ['name' => $attribute->name] : []);
697+
});
698+
694699
if (!$container->getParameter('kernel.debug')) {
695700
// remove tagged iterator argument for resource checkers
696701
$container->getDefinition('config_cache_factory')->setArguments([]);

Resources/config/web.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,40 +46,41 @@
4646
->args([
4747
service('argument_metadata_factory'),
4848
abstract_arg('argument value resolvers'),
49+
abstract_arg('pinned value resolvers'),
4950
])
5051

5152
->set('argument_resolver.backed_enum_resolver', BackedEnumValueResolver::class)
52-
->tag('controller.argument_value_resolver', ['priority' => 100])
53+
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => BackedEnumValueResolver::class])
5354

5455
->set('argument_resolver.uid', UidValueResolver::class)
55-
->tag('controller.argument_value_resolver', ['priority' => 100])
56+
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => UidValueResolver::class])
5657

5758
->set('argument_resolver.datetime', DateTimeValueResolver::class)
5859
->args([
5960
service('clock')->nullOnInvalid(),
6061
])
61-
->tag('controller.argument_value_resolver', ['priority' => 100])
62+
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => DateTimeValueResolver::class])
6263

6364
->set('argument_resolver.request_attribute', RequestAttributeValueResolver::class)
64-
->tag('controller.argument_value_resolver', ['priority' => 100])
65+
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => RequestAttributeValueResolver::class])
6566

6667
->set('argument_resolver.request', RequestValueResolver::class)
67-
->tag('controller.argument_value_resolver', ['priority' => 50])
68+
->tag('controller.argument_value_resolver', ['priority' => 50, 'name' => RequestValueResolver::class])
6869

6970
->set('argument_resolver.session', SessionValueResolver::class)
70-
->tag('controller.argument_value_resolver', ['priority' => 50])
71+
->tag('controller.argument_value_resolver', ['priority' => 50, 'name' => SessionValueResolver::class])
7172

7273
->set('argument_resolver.service', ServiceValueResolver::class)
7374
->args([
7475
abstract_arg('service locator, set in RegisterControllerArgumentLocatorsPass'),
7576
])
76-
->tag('controller.argument_value_resolver', ['priority' => -50])
77+
->tag('controller.argument_value_resolver', ['priority' => -50, 'name' => ServiceValueResolver::class])
7778

7879
->set('argument_resolver.default', DefaultValueResolver::class)
79-
->tag('controller.argument_value_resolver', ['priority' => -100])
80+
->tag('controller.argument_value_resolver', ['priority' => -100, 'name' => DefaultValueResolver::class])
8081

8182
->set('argument_resolver.variadic', VariadicValueResolver::class)
82-
->tag('controller.argument_value_resolver', ['priority' => -150])
83+
->tag('controller.argument_value_resolver', ['priority' => -150, 'name' => VariadicValueResolver::class])
8384

8485
->set('response_listener', ResponseListener::class)
8586
->args([

0 commit comments

Comments
 (0)