From b37e3ee705f4b8c55977d385de7b8e7072518227 Mon Sep 17 00:00:00 2001 From: Marvin Feldmann Date: Thu, 18 Apr 2024 18:16:37 +0200 Subject: [PATCH] [DependencyInjection] Resolve container parameter used in index attribute of service tags --- .../DependencyInjection/CHANGELOG.md | 1 + .../Compiler/PriorityTaggedServiceTrait.php | 6 ++-- .../PriorityTaggedServiceTraitTest.php | 28 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index 82a910cc66b4d..4287747ec4309 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -8,6 +8,7 @@ CHANGELOG * Add a `ContainerBuilder::registerChild()` shortcut method for registering child definitions * Add support for `key-type` in `XmlFileLoader` * Enable non-empty parameters with `ParameterBag::cannotBeEmpty()` and `ContainerBuilder::parameterCannotBeEmpty()` methods + * Resolve parameters found in index attribute of service tags 7.1 --- diff --git a/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php b/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php index 36964dd0e218c..77a1d7ef8ffc2 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php @@ -50,6 +50,7 @@ private function findAndSortTaggedServices(string|TaggedIteratorArgument $tagNam $tagName = $tagName->getTag(); } + $parameterBag = $container->getParameterBag(); $i = 0; $services = []; @@ -81,8 +82,9 @@ private function findAndSortTaggedServices(string|TaggedIteratorArgument $tagNam } if (null !== $indexAttribute && isset($attribute[$indexAttribute])) { - $index = $attribute[$indexAttribute]; - } elseif (null === $defaultIndex && $defaultPriorityMethod && $class) { + $index = $parameterBag->resolveValue($attribute[$indexAttribute]); + } + if (null === $index && null === $defaultIndex && $defaultPriorityMethod && $class) { $defaultIndex = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $class, $defaultIndexMethod ?? 'getDefaultName', $tagName, $indexAttribute, $checkTaggedItem); } $decorated = $definition->getTag('container.decorator')[0]['id'] ?? null; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/PriorityTaggedServiceTraitTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/PriorityTaggedServiceTraitTest.php index 204bf65be16c3..aac1a2e1ae6d8 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/PriorityTaggedServiceTraitTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/PriorityTaggedServiceTraitTest.php @@ -233,6 +233,34 @@ public function testTaggedItemAttributes() $this->assertSame(array_keys($expected), array_keys($services)); $this->assertEquals($expected, $priorityTaggedServiceTraitImplementation->test($tag, $container)); } + + public function testResolveIndexedTags() + { + $container = new ContainerBuilder(); + $container->setParameter('custom_param_service1', 'bar'); + $container->setParameter('custom_param_service2', 'baz'); + $container->setParameter('custom_param_service2_empty', ''); + $container->setParameter('custom_param_service2_null', null); + $container->register('service1')->addTag('my_custom_tag', ['foo' => '%custom_param_service1%']); + + $definition = $container->register('service2', BarTagClass::class); + $definition->addTag('my_custom_tag', ['foo' => '%custom_param_service2%', 'priority' => 100]); + $definition->addTag('my_custom_tag', ['foo' => '%custom_param_service2_empty%']); + $definition->addTag('my_custom_tag', ['foo' => '%custom_param_service2_null%']); + + $priorityTaggedServiceTraitImplementation = new PriorityTaggedServiceTraitImplementation(); + + $tag = new TaggedIteratorArgument('my_custom_tag', 'foo', 'getFooBar'); + $expected = [ + 'baz' => new TypedReference('service2', BarTagClass::class), + 'bar' => new Reference('service1'), + '' => new TypedReference('service2', BarTagClass::class), + 'bar_tab_class_with_defaultmethod' => new TypedReference('service2', BarTagClass::class), + ]; + $services = $priorityTaggedServiceTraitImplementation->test($tag, $container); + $this->assertSame(array_keys($expected), array_keys($services)); + $this->assertEquals($expected, $priorityTaggedServiceTraitImplementation->test($tag, $container)); + } } class PriorityTaggedServiceTraitImplementation