From fdd2ec251e7ee9a95be7b4c54ddbd3b63d770d95 Mon Sep 17 00:00:00 2001 From: HypeMC Date: Wed, 7 Jun 2023 22:02:05 +0200 Subject: [PATCH] [DependencyInjection] Don't ignore attributes on the actual decorator --- .../Compiler/ResolveInstanceofConditionalsPass.php | 7 ++++--- .../Compiler/ResolveInstanceofConditionalsPassTest.php | 10 +++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php index b211b84e1336d..0a55d15d51268 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php @@ -87,7 +87,7 @@ private function processDefinition(ContainerBuilder $container, string $id, Defi $instanceofDef->setAbstract(true)->setParent($parent ?: '.abstract.instanceof.'.$id); $parent = '.instanceof.'.$interface.'.'.$key.'.'.$id; $container->setDefinition($parent, $instanceofDef); - $instanceofTags[] = $instanceofDef->getTags(); + $instanceofTags[] = [$interface, $instanceofDef->getTags()]; $instanceofBindings = $instanceofDef->getBindings() + $instanceofBindings; foreach ($instanceofDef->getMethodCalls() as $methodCall) { @@ -126,8 +126,9 @@ private function processDefinition(ContainerBuilder $container, string $id, Defi // Don't add tags to service decorators $i = \count($instanceofTags); while (0 <= --$i) { - foreach ($instanceofTags[$i] as $k => $v) { - if (null === $definition->getDecoratedService() || \in_array($k, $tagsToKeep, true)) { + [$interface, $tags] = $instanceofTags[$i]; + foreach ($tags as $k => $v) { + if (null === $definition->getDecoratedService() || $interface === $definition->getClass() || \in_array($k, $tagsToKeep, true)) { foreach ($v as $v) { if ($definition->hasTag($k) && \in_array($v, $definition->getTag($k))) { continue; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php index b7ea0f4ac84bb..cdbf7a3185009 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php @@ -318,6 +318,7 @@ public function testDecoratorsAreNotAutomaticallyTagged() $decorator->setDecoratedService('decorated'); $decorator->setInstanceofConditionals([ parent::class => (new ChildDefinition(''))->addTag('tag'), + self::class => (new ChildDefinition(''))->addTag('other-tag'), ]); $decorator->setAutoconfigured(true); $decorator->addTag('manual'); @@ -325,11 +326,18 @@ public function testDecoratorsAreNotAutomaticallyTagged() $container->registerForAutoconfiguration(parent::class) ->addTag('tag') ; + $container->registerForAutoconfiguration(self::class) + ->addTag('last-tag') + ; (new ResolveInstanceofConditionalsPass())->process($container); (new ResolveChildDefinitionsPass())->process($container); - $this->assertSame(['manual' => [[]]], $container->getDefinition('decorator')->getTags()); + $this->assertSame([ + 'manual' => [[]], + 'other-tag' => [[]], + 'last-tag' => [[]], + ], $container->getDefinition('decorator')->getTags()); } public function testDecoratorsKeepBehaviorDescribingTags()