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

Skip to content

Commit 6a33b9b

Browse files
committed
[DependencyInjection] Use AttributeAutoconfigurationPass for #40406
1 parent f94fb5d commit 6a33b9b

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-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;
@@ -584,6 +588,12 @@ public function load(array $configs, ContainerBuilder $container)
584588
$container->registerAttributeForAutoconfiguration(AsController::class, static function (ChildDefinition $definition, AsController $attribute): void {
585589
$definition->addTag('controller.service_arguments');
586590
});
591+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
592+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
593+
});
594+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
595+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
596+
});
587597

588598
if (!$container->getParameter('kernel.debug')) {
589599
// 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: 58 additions & 1 deletion
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;
@@ -339,6 +341,10 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethod()
339341
public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredViaAttribute()
340342
{
341343
$container = new ContainerBuilder();
344+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
345+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
346+
});
347+
342348
$container->register(BarTagClass::class)
343349
->setPublic(true)
344350
->addTag('foo_bar', ['foo' => 'bar_tab_class_with_defaultmethod'])
@@ -349,6 +355,7 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredVia
349355
;
350356
$container->register(IteratorConsumer::class)
351357
->setAutowired(true)
358+
->setAutoconfigured(true)
352359
->setPublic(true)
353360
;
354361

@@ -366,6 +373,10 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredVia
366373
public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
367374
{
368375
$container = new ContainerBuilder();
376+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
377+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
378+
});
379+
369380
$container->register(BarTagClass::class)
370381
->setPublic(true)
371382
->addTag('foo_bar')
@@ -376,6 +387,7 @@ public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
376387
;
377388
$container->register(IteratorConsumerWithDefaultIndexMethod::class)
378389
->setAutowired(true)
390+
->setAutoconfigured(true)
379391
->setPublic(true)
380392
;
381393

@@ -393,6 +405,10 @@ public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
393405
public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribute()
394406
{
395407
$container = new ContainerBuilder();
408+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
409+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
410+
});
411+
396412
$container->register(BarTagClass::class)
397413
->setPublic(true)
398414
->addTag('foo_bar')
@@ -403,6 +419,7 @@ public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribut
403419
;
404420
$container->register(IteratorConsumerWithDefaultPriorityMethod::class)
405421
->setAutowired(true)
422+
->setAutoconfigured(true)
406423
->setPublic(true)
407424
;
408425

@@ -420,6 +437,10 @@ public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribut
420437
public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute()
421438
{
422439
$container = new ContainerBuilder();
440+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
441+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
442+
});
443+
423444
$container->register(BarTagClass::class)
424445
->setPublic(true)
425446
->addTag('foo_bar')
@@ -430,6 +451,7 @@ public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMe
430451
;
431452
$container->register(IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class)
432453
->setAutowired(true)
454+
->setAutoconfigured(true)
433455
->setPublic(true)
434456
;
435457

@@ -447,6 +469,10 @@ public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMe
447469
public function testTaggedLocatorConfiguredViaAttribute()
448470
{
449471
$container = new ContainerBuilder();
472+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
473+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
474+
});
475+
450476
$container->register(BarTagClass::class)
451477
->setPublic(true)
452478
->addTag('foo_bar', ['foo' => 'bar_tab_class_with_defaultmethod'])
@@ -457,6 +483,7 @@ public function testTaggedLocatorConfiguredViaAttribute()
457483
;
458484
$container->register(LocatorConsumer::class)
459485
->setAutowired(true)
486+
->setAutoconfigured(true)
460487
->setPublic(true)
461488
;
462489

@@ -476,6 +503,10 @@ public function testTaggedLocatorConfiguredViaAttribute()
476503
public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
477504
{
478505
$container = new ContainerBuilder();
506+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
507+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
508+
});
509+
479510
$container->register(BarTagClass::class)
480511
->setPublic(true)
481512
->addTag('foo_bar')
@@ -486,6 +517,7 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
486517
;
487518
$container->register(LocatorConsumerWithoutIndex::class)
488519
->setAutowired(true)
520+
->setAutoconfigured(true)
489521
->setPublic(true)
490522
;
491523

@@ -505,6 +537,10 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
505537
public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
506538
{
507539
$container = new ContainerBuilder();
540+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
541+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
542+
});
543+
508544
$container->register(BarTagClass::class)
509545
->setPublic(true)
510546
->addTag('foo_bar')
@@ -515,6 +551,7 @@ public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
515551
;
516552
$container->register(LocatorConsumerWithDefaultIndexMethod::class)
517553
->setAutowired(true)
554+
->setAutoconfigured(true)
518555
->setPublic(true)
519556
;
520557

@@ -534,6 +571,10 @@ public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
10000 534571
public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute()
535572
{
536573
$container = new ContainerBuilder();
574+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
575+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
576+
});
577+
537578
$container->register(BarTagClass::class)
538579
->setPublic(true)
539580
->addTag('foo_bar')
@@ -544,6 +585,7 @@ public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute
544585
;
545586
$container->register(LocatorConsumerWithDefaultPriorityMethod::class)
546587
->setAutowired(true)
588+
->setAutoconfigured(true)
547589
->setPublic(true)
548590
;
549591

@@ -567,6 +609,10 @@ public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute
567609
public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute()
568610
{
569611
$container = new ContainerBuilder();
612+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
613+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
614+
});
615+
570616
$container->register(BarTagClass::class)
571617
->setPublic(true)
572618
->addTag('foo_bar')
@@ -577,6 +623,7 @@ public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMet
577623
;
578624
$container->register(LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class)
579625
->setAutowired(true)
626+
->setAutoconfigured(true)
580627
->setPublic(true)
581628
;
582629

@@ -602,6 +649,10 @@ public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMet
602649
public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
603650
{
604651
$container = new ContainerBuilder();
652+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
653+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
654+
});
655+
605656
$container->register(FooTagClass::class)
606657
->setPublic(true)
607658
->addTag('foo_bar', ['foo' => 'foo'])
@@ -610,7 +661,8 @@ public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
610661
->setPublic(true)
611662
->setArguments([
612663
(new Definition(LocatorConsumer::class))
613-
->setAutowired(true),
664+
->setAutowired(true)
665+
->setAutoconfigured(true),
614666
])
615667
;
616668

@@ -629,6 +681,10 @@ public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
629681
public function testFactoryWithAutoconfiguredArgument()
630682
{
631683
$container = new ContainerBuilder();
684+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
685+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
686+
});
687+
632688
$container->register(FooTagClass::class)
633689
->setPublic(true)
634690
->addTag('foo_bar', ['key' => 'my_service'])
@@ -637,6 +693,7 @@ public function testFactoryWithAutoconfiguredArgument()
637693
$container->register(LocatorConsumer::class)
638694
->setPublic(true)
639695
->setAutowired(true)
696+
->setAutoconfigured(true)
640697
->setFactory(new Reference(LocatorConsumerFactory::class))
641698
;
642699

0 commit comments

Comments
 (0)
0