Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b064cca

Browse files
committed
[DependencyInjection] Use AttributeAutoconfigurationPass for #40406
1 parent 8c0d718 commit b064cca

File tree

3 files changed

+101
-1
lines changed

3 files changed

+101
-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: 85 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;
@@ -186,6 +188,33 @@ public function testCanDecorateServiceLocator()
186188
$this->assertSame($container->get('foo'), $container->get(DecoratedServiceLocator::class)->get('foo'));
187189
}
188190

191+
public function testAliasDecoratedService()
192+
{
193+
$container = new ContainerBuilder();
194+
195+
$container->register('service', ServiceLocator::class)
196+
->setPublic(true)
197+
->setArguments([[]])
198+
;
199+
$container->register('decorator', DecoratedServiceLocator::class)
200+
->setDecoratedService('service')
201+
->setAutowired(true)
202+
->setPublic(true)
203+
;
204+
$container->setAlias(ServiceLocator::class, 'decorator.inner')
205+
->setPublic(true)
206+
;
207+
$container->register('user_service', DecoratedServiceLocator::class)
208+
->setAutowired(true)
209+
;
210+
211+
$container->compile();
212+
213+
$this->assertInstanceOf(DecoratedServiceLocator::class, $container->get('service'));
214+
$this->assertInstanceOf(ServiceLocator::class, $container->get(ServiceLocator::class));
215+
$this->assertSame($container->get('service'), $container->get('decorator'));
216+
}
217+
189218
/**
190219
* @dataProvider getYamlCompileTests
191220
*/
@@ -339,6 +368,10 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethod()
339368
public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredViaAttribute()
340369
{
341370
$container = new ContainerBuilder();
371+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
372+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
373+
});
374+
342375
$container->register(BarTagClass::class)
343376
->setPublic(true)
344377
->addTag('foo_bar', ['foo' => 'bar_tab_class_with_defaultmethod'])
@@ -349,6 +382,7 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredVia
349382
;
350383
$container->register(IteratorConsumer::class)
351384
->setAutowired(true)
385+
->setAutoconfigured(true)
352386
->setPublic(true)
353387
;
354388

@@ -366,6 +400,10 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredVia
366400
public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
367401
{
368402
$container = new ContainerBuilder();
403+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
404+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
405+
});
406+
369407
$container->register(BarTagClass::class)
370408
->setPublic(true)
371409
->addTag('foo_bar')
@@ -376,6 +414,7 @@ public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
376414
;
377415
$container->register(IteratorConsumerWithDefaultIndexMethod::class)
378416
->setAutowired(true)
417+
->setAutoconfigured(true)
379418
->setPublic(true)
380419
;
381420

@@ -393,6 +432,10 @@ public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
393432
public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribute()
394433
{
395434
$container = new ContainerBuilder();
435+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
436+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
437+
});
438+
396439
$container->register(BarTagClass::class)
397440
->setPublic(true)
398441
->addTag('foo_bar')
@@ -403,6 +446,7 @@ public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribut
403446
;
404447
$container->register(IteratorConsumerWithDefaultPriorityMethod::class)
405448
->setAutowired(true)
449+
->setAutoconfigured(true)
406450
->setPublic(true)
407451
;
408452

@@ -420,6 +464,10 @@ public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribut
420464
public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute()
421465
{
422466
$container = new ContainerBuilder();
467+
$container->registerAttributeForAutoconfiguration(TaggedIterator::class, static function (ChildDefinition $definition, TaggedIterator $attribute, \ReflectionParameter $reflector) {
468+
$definition->setArgument($reflector->getPosition(), new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod));
469+
});
470+
423471
$container->register(BarTagClass::class)
424472
->setPublic(true)
425473
->addTag('foo_bar')
@@ -430,6 +478,7 @@ public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMe
430478
;
431479
$container->register(IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class)
432480
->setAutowired(true)
481+
->setAutoconfigured(true)
433482
->setPublic(true)
434483
;
435484

@@ -447,6 +496,10 @@ public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMe
447496
public function testTaggedLocatorConfiguredViaAttribute()
448497
{
449498
$container = new ContainerBuilder();
499+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
500+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
501+
});
502+
450503
$container->register(BarTagClass::class)
451504
->setPublic(true)
452505
->addTag('foo_bar', ['foo' => 'bar_tab_class_with_defaultmethod'])
@@ -457,6 +510,7 @@ public function testTaggedLocatorConfiguredViaAttribute()
457510
;
458511
$container->register(LocatorConsumer::class)
459512
->setAutowired(true)
513+
->setAutoconfigured(true)
460514
->setPublic(true)
461515
;
462516

@@ -476,6 +530,10 @@ public function testTaggedLocatorConfiguredViaAttribute()
476530
public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
477531
{
478532
$container = new ContainerBuilder();
533+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
534+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
535+
});
536+
479537
$container->register(BarTagClass::class)
480538
->setPublic(true)
481539
->addTag('foo_bar')
@@ -486,6 +544,7 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
486544
;
487545
$container->register(LocatorConsumerWithoutIndex::class)
488546
->setAutowired(true)
547+
->setAutoconfigured(true)
489548
->setPublic(true)
490549
;
491550

@@ -505,6 +564,10 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
505564
public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
506565
{
507566
$container = new ContainerBuilder();
567+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
568+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
569+
});
570+
508571
$container->register(BarTagClass::class)
509572
->setPublic(true)
510573
->addTag('foo_bar')
@@ -515,6 +578,7 @@ public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
515578
;
516579
$container->register(LocatorConsumerWithDefaultIndexMethod::class)
517580
->setAutowired(true)
581+
->setAutoconfigured(true)
518582
->setPublic(true)
519583
;
520584

@@ -534,6 +598,10 @@ public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
534598
public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute()
535599
{
536600
$container = new ContainerBuilder();
601+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
602+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
603+
});
604+
537605
$container->register(BarTagClass::class)
538606
->setPublic(true)
539607
->addTag('foo_bar')
@@ -544,6 +612,7 @@ public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute
544612
;
545613
$container->register(LocatorConsumerWithDefaultPriorityMethod::class)
546614
->setAutowired(true)
615+
->setAutoconfigured(true)
547616
->setPublic(true)
548617
;
549618

@@ -567,6 +636,10 @@ public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute
567636
public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute()
568637
{
569638
$container = new ContainerBuilder();
639+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
640+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
641+
});
642+
570643
$container->register(BarTagClass::class)
571644
->setPublic(true)
572645
->addTag('foo_bar')
@@ -577,6 +650,7 @@ public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMet
577650
;
578651
$container->register(LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class)
579652
->setAutowired(true)
653+
->setAutoconfigured(true)
580654
->setPublic(true)
581655
;
582656

@@ -602,6 +676,10 @@ public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMet
602676
public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
603677
{
604678
$container = new ContainerBuilder();
679+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
680+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
681+
});
682+
605683
$container->register(FooTagClass::class)
606684
->setPublic(true)
607685
->addTag('foo_bar', ['foo' => 'foo'])
@@ -610,7 +688,8 @@ public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
610688
->setPublic(true)
611689
->setArguments([
612690
(new Definition(LocatorConsumer::class))
613-
->setAutowired(true),
691+
->setAutowired(true)
692+
->setAutoconfigured(true),
614693
])
615694
;
616695

@@ -629,6 +708,10 @@ public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
629708
public function testFactoryWithAutoconfiguredArgument()
630709
{
631710
$container = new ContainerBuilder();
711+
$container->registerAttributeForAutoconfiguration(TaggedLocator::class, static function (ChildDefinition $definition, TaggedLocator $attribute, \ReflectionParameter $reflector) {
712+
$definition->setArgument($reflector->getPosition(), new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod)));
713+
});
714+
632715
$container->register(FooTagClass::class)
633716
->setPublic(true)
634717
->addTag('foo_bar', ['key' => 'my_service'])
@@ -637,6 +720,7 @@ public function testFactoryWithAutoconfiguredArgument()
637720
$container->register(LocatorConsumer::class)
638721
->setPublic(true)
639722
->setAutowired(true)
723+
->setAutoconfigured(true)
640724
->setFactory(new Reference(LocatorConsumerFactory::class))
641725
;
642726

0 commit comments

Comments
 (0)