8000 [DependencyInjection] Use AttributeAutoconfigurationPass for #40406 · okhoshi/symfony@ac9ddc3 · GitHub
[go: up one dir, main page]

Skip to content

Commit ac9ddc3

Browse files
committed
[DependencyInjection] Use AttributeAutoconfigurationPass for symfony#40406
1 parent 7eaee59 commit ac9ddc3

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
use Symfony\Component\Console\Command\Command;
4646
use Symfony\Component\DependencyInjection\Alias;
4747
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
48+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
49+
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
50+
use Symfony\Component\DependencyInjection\Attribute\TaggedIterator;
51+
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
4852
use Symfony\Component\DependencyInjection\ChildDefinition;
4953
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
5054
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -583,6 +587,12 @@ public function load(array $configs, ContainerBuilder $container)
583587
$container->registerAttributeForAutoconfiguration(AsController::class, static function (ChildDefinition $definition, AsController $attribute): void {
584588
$definition->addTag('controller.service_arguments');
585589
});
590+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
591+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute));
592+
});
593+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
594+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, null, true)));
595+
});
586596

587597
if (!$container->getParameter('kernel.debug')) {
588598
// remove tagged iterator argument for resource checkers

src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ public function process(ContainerBuilder $container)
5252

5353
private function processDefinition(ContainerBuilder $container, string $id, Definition $definition, array $tagsToKeep): Definition
5454
{
55+
foreach ($definition->getArguments() as $key => $argument) {
56+
if ($argument instanceof Definition) {
57+
$definition->setArgument($key, $this->processDefinition($container, $argument->getClass() ?? $id.'.'.$key, $argument, $tagsToKeep));
58+
}
59+
}
60+
5561
$instanceofConditionals = $definition->getInstanceofConditionals();
5662
$autoconfiguredInstanceof = $definition->isAutoconfigured() ? $container->getAutoconfiguredInstanceof() : [];
5763
if (!$instanceofConditionals && !$autoconfiguredInstanceof) {

src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php

Lines changed: 28 additions & 1 deletion
< B25C tr class="diff-line-row">
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
use Symfony\Component\DependencyInjection\Alias;
1717
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1818
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
19+
use Symfony\Component\DependencyInjection\Attribute\TaggedIterator;
20+
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
1921
use Symfony\Component\DependencyInjection\ChildDefinition;
2022
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
2123
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -333,6 +335,10 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethod()
333335
public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredViaAttribute()
334336
{
335337
$container = new ContainerBuilder();
338+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
339+
$definition-> 8000 ;setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, null, true));
340+
});
341+
336342
$container->register(BarTagClass::class)
337343
->setPublic(true)
338344
->addTag('foo_bar', ['foo' => 'bar_tab_class_with_defaultmethod'])
@@ -343,6 +349,7 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredVia
343349
;
344350
$container->register(IteratorConsumer::class)
345351
->setAutowired(true)
352+
->setAutoconfigured(true)
346353
->setPublic(true)
347354
;
348355

@@ -386,6 +393,10 @@ public function testTaggedIteratorWithMultipleIndexAttribute()
386393
public function testTaggedLocatorConfiguredViaAttribute()
387394
{
388395
$container = new ContainerBuilder();
396+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
397+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, null, true)));
398+
});
399+
389400
$container->register(BarTagClass::class)
390401
->setPublic(true)
391402
->addTag('foo_bar', ['foo' => 'bar_tab_class_with_defaultmethod'])
@@ -396,6 +407,7 @@ public function testTaggedLocatorConfiguredViaAttribute()
396407
;
397408
$container->register(LocatorConsumer::class)
398409
->setAutowired(true)
410+
->setAutoconfigured(true)
399411
->setPublic(true)
400412
;
401413

@@ -415,6 +427,10 @@ public function testTaggedLocatorConfiguredViaAttribute()
415427
public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
416428
{
417429
$container = new ContainerBuilder();
430+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
431+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, null, true)));
432+
});
433+
418434
$container->register(BarTagClass::class)
419435
->setPublic(true)
420436
->addTag('foo_bar')
@@ -425,6 +441,7 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
425441
;
426442
$container->register(LocatorConsumerWithoutIndex::class)
427443
->setAutowired(true)
444+
->setAutoconfigured(true)
428445
->setPublic(true)
429446
;
430447

@@ -444,6 +461,10 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
444461
public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
445462
{
446463
$container = new ContainerBuilder();
464+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
465+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, null, true)));
466+
});
467+
447468
$container->register(FooTagClass::class)
448469
->setPublic(true)
449470
->addTag('foo_bar', ['foo' => 'foo'])
@@ -452,7 +473,8 @@ public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
452473
->setPublic(true)
453474
->setArguments([
454475
(new Definition(LocatorConsumer::class))
455-
->setAutowired(true),
476+
->setAutowired(true)
477+
->setAutoconfigured(true),
456478
])
457479
;
458480

@@ -471,6 +493,10 @@ public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
471493
public function testFactoryWithAutoconfiguredArgument()
472494
{
473495
$container = new ContainerBuilder();
496+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
497+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, null, true)));
498+
});
499+
474500
$container->register(FooTagClass::class)
475501
->setPublic(true)
476502
->addTag('foo_bar', ['key' => 'my_service'])
@@ -479,6 +505,7 @@ public function testFactoryWithAutoconfiguredArgument()
479505
$container->register(LocatorConsumer::class)
480506
->setPublic(true)
481507
->setAutowired(true)
508+
->setAutoconfigured(true)
482509
->setFactory(new Reference(LocatorConsumerFactory::class))
483510
;
484511

0 commit comments

Comments
 (0)
0