8000 Adding the ArgumentResolver component · symfony/symfony@e891ad9 · GitHub
[go: up one dir, main page]

Skip to content

Commit e891ad9

Browse files
committed
Adding the ArgumentResolver component
1 parent 6fe4cb5 commit e891ad9

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
use Symfony\Component\HttpKernel\Attribute\AsTargetedValueResolver;
9797
use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
9898
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
99+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\ValueResolver\ControllerValueResolverInterface;
99100
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
100101
use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
101102
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
@@ -239,12 +240,14 @@ public function load(array $configs, ContainerBuilder $container): void
239240
$container->setParameter('validator.translation_domain', 'validators');
240241
}
241242

243+
$loader->load('argument_resolver.php');
242244
$loader->load('web.php');
243245
$loader->load('services.php');
244246
$loader->load('fragment_renderer.php');
245247
$loader->load('error_renderer.php');
246248

247249
if (!ContainerBuilder::willBeAvailable('symfony/clock', ClockInterface::class, ['symfony/framework-bundle'])) {
250+
$container->removeDefinition('clock');
248251
$container->removeDefinition('clock');
249252
$container->removeAlias(ClockInterface::class);
250253
$container->removeAlias(PsrClockInterface::class);
@@ -418,6 +421,7 @@ public function load(array $configs, ContainerBuilder $container): void
418421

419422
$this->registerSerializerConfiguration($config['serializer'], $container, $loader);
420423
} else {
424+
// @deprecated since Symfony 7.3
421425
$container->getDefinition('argument_resolver.request_payload')
422426
->setArguments([])
423427
->addError('You can neither use "#[MapRequestPayload]" nor "#[MapQueryString]" since the Serializer component is not '
@@ -426,6 +430,14 @@ public function load(array $configs, ContainerBuilder $container): void
426430
->addTag('container.error')
427431
->clearTag('kernel.event_subscriber');
428432

433+
/*$container->getDefinition('argument_resolver.controller.request_payload')
434+
->setArguments([])
435+
->addError('You can neither use "#[MapRequestPayload]" nor "#[MapQueryString]" since the Serializer component is not '
436+
.(class_exists(Serializer::class) ? 'enabled. Try setting "framework.serializer.enabled" to true.' : 'installed. Try running "composer require symfony/serializer-pack".')
437+
)
438+
->addTag('container.error')
439+
->clearTag('kernel.event_subscriber');
440+
*/
429441
$container->removeDefinition('console.command.serializer_debug');
430442
}
431443

@@ -476,7 +488,8 @@ public function load(array $configs, ContainerBuilder $container): void
476488

477489
$this->registerUidConfiguration($config['uid'], $container, $loader);
478490
} else {
479-
$container->removeDefinition('argument_resolver.uid');
491+
$container->removeDefinition('argument_resolver.uid'); // @deprecated since Symfony 7.3
492+
$container->removeDefinition('argument_resolver.controller.uid');
480493
}
481494

482495
// register cache before session so both can share the connection services
@@ -637,6 +650,9 @@ public function load(array $configs, ContainerBuilder $container): void
637650
->addTag('container.service_locator');
638651
$container->registerForAutoconfiguration(ServiceSubscriberInterface::class)
639652
->addTag('container.service_subscriber');
653+
$container->registerForAutoconfiguration(ControllerValueResolverInterface::class)
654+
->addTag('controller.argument_value_resolver');
655+
// @deprecated since Symfony 7.3
640656
$container->registerForAutoconfiguration(ValueResolverInterface::class)
641657
->addTag('controller.argument_value_resolver');
642658
$container->registerForAutoconfiguration(AbstractController::class)
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\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

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class_exists(WorkflowEvents::class) ? WorkflowEvents::ALIASES : []
9090
service('event_dispatcher'),
9191
service('controller_resolver'),
9292
service('request_stack'),
93-
service('argument_resolver'),
93+
service('controller.argument_resolver'),
9494
false,
9595
])
9696
->tag('container.hot_path')

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

+114-33
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, 48DA 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([
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

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
0