From b917fafc8db117462e40392ac2b0cd88ae431ee3 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Tue, 25 May 2021 14:32:48 +0200 Subject: [PATCH] keep container.service_subscriber tag on the decorated definition --- .../Compiler/DecoratorServicePass.php | 10 ++++++---- .../Compiler/DecoratorServicePassTest.php | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php b/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php index 7659b8336e..fed2916f34 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php @@ -82,10 +82,12 @@ class DecoratorServicePass implements CompilerPassInterface $decoratingTags = $decoratingDefinition->getTags(); $resetTags = []; - if (isset($decoratingTags['container.service_locator'])) { - // container.service_locator has special logic and it must not be transferred out to decorators - $resetTags = ['container.service_locator' => $decoratingTags['container.service_locator']]; - unset($decoratingTags['container.service_locator']); + // container.service_locator and container.service_subscriber have special logic and they must not be transferred out to decorators + foreach (['container.service_locator', 'container.service_subscriber'] as $containerTag) { + if (isset($decoratingTags[$containerTag])) { + $resetTags[$containerTag] = $decoratingTags[$containerTag]; + unset($decoratingTags[$containerTag]); + } } $definition->setTags(array_merge($decoratingTags, $definition->getTags())); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php index ce9a2cfafe..a739dda3a6 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php @@ -243,6 +243,25 @@ class DecoratorServicePassTest extends TestCase $this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar']], $container->getDefinition('baz')->getTags()); } + public function testProcessLeavesServiceSubscriberTagOnOriginalDefinition() + { + $container = new ContainerBuilder(); + $container + ->register('foo') + ->setTags(['container.service_subscriber' => [], 'bar' => ['attr' => 'baz']]) + ; + $container + ->register('baz') + ->setTags(['foobar' => ['attr' => 'bar']]) + ->setDecoratedService('foo') + ; + + $this->process($container); + + $this->assertEquals(['container.service_subscriber' => []], $container->getDefinition('baz.inner')->getTags()); + $this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar']], $container->getDefinition('baz')->getTags()); + } + protected function process(ContainerBuilder $container) { $repeatedPass = new DecoratorServicePass();