From 05ecf829fe52315c7e641f605167133c3a9b98f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Fri, 1 Mar 2019 10:40:47 +0100 Subject: [PATCH] Autoconfig: don't automatically tag decorators --- .../ResolveInstanceofConditionalsPass.php | 17 ++++++++------ .../ResolveInstanceofConditionalsPassTest.php | 22 +++++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php index 02021c8bc5..0b56476c69 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php @@ -113,14 +113,17 @@ class ResolveInstanceofConditionalsPass implements CompilerPassInterface $definition->setShared($shared); } - $i = \count($instanceofTags); - while (0 <= --$i) { - foreach ($instanceofTags[$i] as $k => $v) { - foreach ($v as $v) { - if ($definition->hasTag($k) && \in_array($v, $definition->getTag($k))) { - continue; + // Don't add tags to service decorators + if (null === $definition->getDecoratedService()) { + $i = \count($instanceofTags); + while (0 <= --$i) { + foreach ($instanceofTags[$i] as $k => $v) { + foreach ($v as $v) { + if ($definition->hasTag($k) && \in_array($v, $definition->getTag($k))) { + continue; + } + $definition->addTag($k, $v); } - $definition->addTag($k, $v); } } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php index 88cc88b9dc..7fee5194f0 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php @@ -307,4 +307,26 @@ class ResolveInstanceofConditionalsPassTest extends TestCase $this->assertInstanceOf(BoundArgument::class, $bindings['$toto']); $this->assertSame(123, $bindings['$toto']->getValues()[0]); } + + public function testDecoratorsAreNotAutomaticallyTagged() + { + $container = new ContainerBuilder(); + + $decorator = $container->register('decorator', self::class); + $decorator->setDecoratedService('decorated'); + $decorator->setInstanceofConditionals([ + parent::class => (new ChildDefinition(''))->addTag('tag'), + ]); + $decorator->setAutoconfigured(true); + $decorator->addTag('manual'); + + $container->registerForAutoconfiguration(parent::class) + ->addTag('tag') + ; + + (new ResolveInstanceofConditionalsPass())->process($container); + (new ResolveChildDefinitionsPass())->process($container); + + $this->assertSame(['manual' => [[]]], $container->getDefinition('decorator')->getTags()); + } }