Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit b064cca

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

File tree

3 files changed

+101
-1
lines changed
Filter options

3 files changed

+101
-1
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
+10Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php
+6Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php
+85-1Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.