bug #41407 [DependencyInjection] keep container.service_subscriber tag on the decorated definition (xabbuh)

This PR was merged into the 4.4 branch.

Discussion
----------

[DependencyInjection] keep container.service_subscriber tag on the decorated definition

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       |
| License       | MIT
| Doc PR        |

Commits
-------

b917fafc8d keep container.service_subscriber tag on the decorated definition
This commit is contained in:
Nicolas Grekas 2021-05-26 19:54:16 +02:00
commit 519d348b4a
2 changed files with 25 additions and 4 deletions

View File

@ -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()));

View File

@ -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();