Skip to content

Commit fbfae9a

Browse files
committed
Adding the ArgumentResolver component
1 parent 2468bae commit fbfae9a

File tree

80 files changed

+2991
-243
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+2991
-243
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
use Symfony\Component\HttpKernel\Attribute\AsTargetedValueResolver;
102102
use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
103103
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
104+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\ControllerValueResolverInterface;
104105
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
105106
use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
106107
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
@@ -246,12 +247,14 @@ public function load(array $configs, ContainerBuilder $container): void
246247
$container->setParameter('validator.translation_domain', 'validators');
247248
}
248249

250+
$loader->load('argument_resolver.php');
249251
$loader->load('web.php');
250252
$loader->load('services.php');
251253
$loader->load('fragment_renderer.php');
252254
$loader->load('error_renderer.php');
253255

254256
if (!ContainerBuilder::willBeAvailable('symfony/clock', ClockInterface::class, ['symfony/framework-bundle'])) {
257+
$container->removeDefinition('clock');
255258
$container->removeDefinition('clock');
256259
$container->removeAlias(ClockInterface::class);
257260
$container->removeAlias(PsrClockInterface::class);
@@ -425,6 +428,7 @@ public function load(array $configs, ContainerBuilder $container): void
425428

426429
$this->registerSerializerConfiguration($config['serializer'], $container, $loader);
427430
} else {
431+
// @deprecated since Symfony 7.3
428432
$container->getDefinition('argument_resolver.request_payload')
429433
->setArguments([])
430434
->addError('You can neither use "#[MapRequestPayload]" nor "#[MapQueryString]" since the Serializer component is not '
@@ -433,6 +437,14 @@ public function load(array $configs, ContainerBuilder $container): void
433437
->addTag('container.error')
434438
->clearTag('kernel.event_subscriber');
435439

440+
/*$container->getDefinition('argument_resolver.controller.request_payload')
441+
->setArguments([])
442+
->addError('You can neither use "#[MapRequestPayload]" nor "#[MapQueryString]" since the Serializer component is not '
443+
.(class_exists(Serializer::class) ? 'enabled. Try setting "framework.serializer.enabled" to true.' : 'installed. Try running "composer require symfony/serializer-pack".')
444+
)
445+
->addTag('container.error')
446+
->clearTag('kernel.event_subscriber');
447+
*/
436448
$container->removeDefinition('console.command.serializer_debug');
437449
}
438450

@@ -483,7 +495,8 @@ public function load(array $configs, ContainerBuilder $container): void
483495

484496
$this->registerUidConfiguration($config['uid'], $container, $loader);
485497
} else {
486-
$container->removeDefinition('argument_resolver.uid');
498+
$container->removeDefinition('argument_resolver.uid'); // @deprecated since Symfony 7.3
499+
$container->removeDefinition('argument_resolver.controller.uid');
487500
}
488501

489502
// register cache before session so both can share the connection services
@@ -644,6 +657,9 @@ public function load(array $configs, ContainerBuilder $container): void
644657
->addTag('container.service_locator');
645658
$container->registerForAutoconfiguration(ServiceSubscriberInterface::class)
646659
->addTag('container.service_subscriber');
660+
$container->registerForAutoconfiguration(ControllerValueResolverInterface::class)
661+
->addTag('controller.argument_value_resolver');
662+
// @deprecated since Symfony 7.3
647663
$container->registerForAutoconfiguration(ValueResolverInterface::class)
648664
->addTag('controller.argument_value_resolver');
649665
$container->registerForAutoconfiguration(AbstractController::class)
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 <[email protected]>
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\DependencyInjection\Loader\Configurator;
13+
14+
use Symfony\Component\ArgumentResolver\ArgumentMetadata\ArgumentMetadataFactory;
15+
use Symfony\Component\ArgumentResolver\ValueResolver\DefaultValueResolver;
16+
17+
return static function (ContainerConfigurator $container) {
18+
$container->services()
19+
->set('argument_resolver.argument_metadata_factory', ArgumentMetadataFactory::class)
20+
21+
->set('argument_resolver.default', DefaultValueResolver::class)
22+
->tag('argument_resolver.controller.value_resolver', ['priority' => -100, 'name' => DefaultValueResolver::class])
23+
;
24+
};

src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
])
3838

3939
->set('debug.argument_resolver', TraceableArgumentResolver::class)
40-
->decorate('argument_resolver')
40+
->decorate('controller.argument_resolver')
4141
->args([
4242
service('debug.argument_resolver.inner'),
4343
service('debug.stopwatch'),

src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class_exists(WorkflowEvents::class) ? WorkflowEvents::ALIASES : []
9191
service('event_dispatcher'),
9292
service('controller_resolver'),
9393
service('request_stack'),
94-
service('argument_resolver'),
94+
service('controller.argument_resolver'),
9595
false,
9696
])
9797
->tag('container.hot_path')

src/Symfony/Bundle/FrameworkBundle/Resources/config/web.php

Lines changed: 114 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,29 @@
1414
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1515
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
1616
use Symfony\Bundle\FrameworkBundle\Controller\TemplateController;
17-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
18-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\BackedEnumValueResolver;
19-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DateTimeValueResolver;
20-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
21-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\QueryParameterValueResolver;
22-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
23-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestPayloadValueResolver;
24-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver;
25-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ServiceValueResolver;
26-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver;
27-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\UidValueResolver;
28-
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver;
17+
use Symfony\Component\ArgumentResolver\ValueResolver\DefaultValueResolver;
18+
use Symfony\Component\ArgumentResolver\ValueResolver\ServiceValueResolver;
19+
use Symfony\Component\ArgumentResolver\ValueResolver\UidValueResolver;
20+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\BackedEnumValueResolver as LegacyBackedEnumValueResolver;
21+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DateTimeValueResolver as LegacyDateTimeValueResolver;
22+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver as LegacyDefaultValueResolver;
23+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\QueryParameterValueResolver as LegacyQueryParameterValueResolver;
24+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver as LegacyRequestAttributeValueResolver;
25+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestPayloadValueResolver as LegacyRequestPayloadValueResolver;
26+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver as LegacyRequestValueResolver;
27+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ServiceValueResolver as LegacyServiceValueResolver;
28+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver as LegacySessionValueResolver;
29+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\UidValueResolver as LegacyUidValueResolver;
30+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\BackedEnumValueResolver;
31+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\DateTimeValueResolver;
32+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\QueryParameterValueResolver;
33+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\RequestAttributeValueResolver;
34+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\RequestPayloadValueResolver;
35+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\RequestValueResolver;
36+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\SessionValueResolver;
37+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\VariadicValueResolver;
38+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver as LegacyVariadicValueResolver;
39+
use Symfony\Component\HttpKernel\Controller\ControllerArgumentResolver;
2940
use Symfony\Component\HttpKernel\Controller\ErrorController;
3041
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
3142
use Symfony\Component\HttpKernel\EventListener\CacheAttributeListener;
@@ -45,28 +56,97 @@
4556
->call('allowControllers', [[AbstractController::class, TemplateController::class]])
4657
->tag('monolog.logger', ['channel' => 'request'])
4758

59+
# Deprecated Argument Resolver and Value Resolvers
4860
->set('argument_metadata_factory', ArgumentMetadataFactory::class)
61+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.argument_metadata_factory" instead.')
4962

50-
->set('argument_resolver', ArgumentResolver::class)
63+
->set('argument_resolver', \Symfony\Component\HttpKernel\Controller\ArgumentResolver::class)
5164
->args([
5265
service('argument_metadata_factory'),
5366
abstract_arg('argument value resolvers'),
5467
abstract_arg('targeted value resolvers'),
5568
])
69+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller" instead.')
5670

57-
->set('argument_resolver.backed_enum_resolver', BackedEnumValueResolver::class)
58-
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => BackedEnumValueResolver::class])
71+
->set('argument_resolver.backed_enum_resolver', LegacyBackedEnumValueResolver::class)
72+
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => LegacyBackedEnumValueResolver::class])
73+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.backed_enum" instead.')
5974

60-
->set('argument_resolver.uid', UidValueResolver::class)
61-
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => UidValueResolver::class])
75+
->set('argument_resolver.uid', LegacyUidValueResolver::class)
76+
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => LegacyUidValueResolver::class])
77+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.uid" instead.')
6278

63-
->set('argument_resolver.datetime', DateTimeValueResolver::class)
79+
->set('argument_resolver.datetime', LegacyDateTimeValueResolver::class)
6480
->args([
6581
service('clock')->nullOnInvalid(),
6682
])
67-
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => DateTimeValueResolver::class])
83+
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => LegacyDateTimeValueResolver::class])
84+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.datetime" instead.')
6885

69-
->set('argument_resolver.request_payload', RequestPayloadValueResolver::class)
86+
->set('argument_resolver.request_payload', LegacyRequestPayloadValueResolver::class)
87+
->args([
88+
service('serializer'),
89+
service('validator')->nullOnInvalid(),
90+
service('translator')->nullOnInvalid(),
91+
param('validator.translation_domain'),
92+
])
93+
->tag('controller.targeted_value_resolver', ['name' => LegacyRequestPayloadValueResolver::class])
94+
->tag('kernel.event_subscriber')
95+
->lazy()
96+
97+
->set('argument_resolver.request_attribute', LegacyRequestAttributeValueResolver::class)
98+
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => LegacyRequestAttributeValueResolver::class])
99+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.request_attribute" instead.')
100+
101+
->set('argument_resolver.request', LegacyRequestValueResolver::class)
102+
->tag('controller.argument_value_resolver', ['priority' => 50, 'name' => LegacyRequestValueResolver::class])
103+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.request" instead.')
104+
105+
->set('argument_resolver.session', LegacySessionValueResolver::class)
106+
->tag('controller.argument_value_resolver', ['priority' => 50, 'name' => LegacySessionValueResolver::class])
107+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.session" instead.')
108+
109+
->set('argument_resolver.service', LegacyServiceValueResolver::class)
110+
->args([
111+
abstract_arg('service locator, set in RegisterControllerArgumentLocatorsPass'),
112+
])
113+
->tag('controller.argument_value_resolver', ['priority' => -50, 'name' => LegacyServiceValueResolver::class])
114+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.service" instead.')
115+
116+
->set('argument_resolver.default', LegacyDefaultValueResolver::class)
117+
->tag('argument_resolver.controller.value_resolver', ['priority' => -100, 'name' => LegacyDefaultValueResolver::class])
118+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.default" instead.')
119+
120+
->set('argument_resolver.variadic', LegacyVariadicValueResolver::class)
121+
->tag('controller.argument_value_resolver', ['priority' => -150, 'name' => LegacyVariadicValueResolver::class])
122+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.variadic" instead.')
123+
124+
->set('argument_resolver.query_parameter_value_resolver', LegacyQueryParameterValueResolver::class)
125+
->tag('controller.targeted_value_resolver', ['name' => LegacyQueryParameterValueResolver::class])
126+
->deprecate('symfony/framework-bundle', '7.3', 'The "%service_id%" service is deprecated, use "argument_resolver.controller.query_parameter" instead.')
127+
128+
# Controller Argument Resolver and Value Resolvers
129+
->set('controller.argument_resolver', ControllerArgumentResolver::class)
130+
->args([
131+
service('argument_resolver.argument_metadata_factory'),
132+
abstract_arg('argument value resolvers'),
133+
abstract_arg('targeted value resolvers'),
134+
])
135+
136+
/*
137+
->set('argument_resolver.controller.backed_enum', BackedEnumValueResolver::class)
138+
->tag('argument_resolver.controller.value_resolver', ['priority' => 100, 'name' => BackedEnumValueResolver::class])
139+
140+
->set('argument_resolver.controller.uid', UidValueResolver::class)
141+
->tag('argument_resolver.controller.value_resolver', ['priority' => 100, 'name' => UidValueResolver::class])
142+
143+
->set('argument_resolver.controller.datetime', DateTimeValueResolver::class)
144+
->args([
145+
service('clock')->nullOnInvalid(),
146+
])
147+
->tag('argument_resolver.controller.value_resolver', ['priority' => 100, 'name' => DateTimeValueResolver::class])
148+
149+
->set('argument_resolver.controller.request_payload', RequestPayloadValueResolver::class)
70150
->args([
71151
service('serializer'),
72152
service('validator')->nullOnInvalid(),
@@ -77,29 +157,30 @@
77157
->tag('kernel.event_subscriber')
78158
->lazy()
79159
80-
->set('argument_resolver.request_attribute', RequestAttributeValueResolver::class)
81-
->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => RequestAttributeValueResolver::class])
160+
->set('argument_resolver.controller.request_attribute', RequestAttributeValueResolver::class)
161+
->tag('argument_resolver.controller.value_resolver', ['priority' => 100, 'name' => RequestAttributeValueResolver::class])
82162
83-
->set('argument_resolver.request', RequestValueResolver::class)
84-
->tag('controller.argument_value_resolver', ['priority' => 50, 'name' => RequestValueResolver::class])
163+
->set('argument_resolver.controller.request', RequestValueResolver::class)
164+
->tag('argument_resolver.controller.value_resolver', ['priority' => 50, 'name' => RequestValueResolver::class])
85165
86-
->set('argument_resolver.session', SessionValueResolver::class)
87-
->tag('controller.argument_value_resolver', ['priority' => 50, 'name' => SessionValueResolver::class])
166+
->set('argument_resolver.controller.session', SessionValueResolver::class)
167+
->tag('argument_resolver.controller.value_resolver', ['priority' => 50, 'name' => SessionValueResolver::class])
88168
89-
->set('argument_resolver.service', ServiceValueResolver::class)
169+
->set('argument_resolver.controller.service', ServiceValueResolver::class)
90170
->args([
91171
abstract_arg('service locator, set in RegisterControllerArgumentLocatorsPass'),
92172
])
93-
->tag('controller.argument_value_resolver', ['priority' => -50, 'name' => ServiceValueResolver::class])
173+
->tag('argument_resolver.controller.value_resolver', ['priority' => -50, 'name' => ServiceValueResolver::class])
94174
95-
->set('argument_resolver.default', DefaultValueResolver::class)
96-
->tag('controller.argument_value_resolver', ['priority' => -100, 'name' => DefaultValueResolver::class])
175+
->set('argument_resolver.controller.default', DefaultValueResolver::class)
176+
->tag('argument_resolver.controller.value_resolver', ['priority' => -100, 'name' => DefaultValueResolver::class])
97177
98-
->set('argument_resolver.variadic', VariadicValueResolver::class)
99-
->tag('controller.argument_value_resolver', ['priority' => -150, 'name' => VariadicValueResolver::class])
178+
->set('argument_resolver.controller.variadic', VariadicValueResolver::class)
179+
->tag('argument_resolver.controller.value_resolver', ['priority' => -150, 'name' => VariadicValueResolver::class])
100180
101-
->set('argument_resolver.query_parameter_value_resolver', QueryParameterValueResolver::class)
181+
->set('argument_resolver.controller.query_parameter_value_resolver', QueryParameterValueResolver::class)
102182
->tag('controller.targeted_value_resolver', ['name' => QueryParameterValueResolver::class])
183+
*/
103184

104185
->set('response_listener', ResponseListener::class)
105186
->args([
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/Tests export-ignore
2+
/phpunit.xml.dist export-ignore
3+
/.git* export-ignore

src/Symfony/Component/ArgumentResolver/.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)