[DI] DecoratorServicePass should keep container.service_locator on the decorated definition
This commit is contained in:
parent
ccfc4b67b3
commit
99dab87ada
@ -64,8 +64,18 @@ class DecoratorServicePass implements CompilerPassInterface
|
|||||||
|
|
||||||
if (isset($decoratingDefinitions[$inner])) {
|
if (isset($decoratingDefinitions[$inner])) {
|
||||||
$decoratingDefinition = $decoratingDefinitions[$inner];
|
$decoratingDefinition = $decoratingDefinitions[$inner];
|
||||||
$definition->setTags(array_merge($decoratingDefinition->getTags(), $definition->getTags()));
|
|
||||||
$decoratingDefinition->setTags([]);
|
$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']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$definition->setTags(array_merge($decoratingTags, $definition->getTags()));
|
||||||
|
$decoratingDefinition->setTags($resetTags);
|
||||||
$decoratingDefinitions[$inner] = $definition;
|
$decoratingDefinitions[$inner] = $definition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,6 +167,25 @@ class DecoratorServicePassTest extends TestCase
|
|||||||
$this->assertEquals(['bar' => ['attr' => 'baz']], $container->getDefinition('deco2')->getTags());
|
$this->assertEquals(['bar' => ['attr' => 'baz']], $container->getDefinition('deco2')->getTags());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testProcessLeavesServiceLocatorTagOnOriginalDefinition()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
$container
|
||||||
|
->register('foo')
|
||||||
|
->setTags(['container.service_locator' => [0 => []], 'bar' => ['attr' => 'baz']])
|
||||||
|
;
|
||||||
|
$container
|
||||||
|
->register('baz')
|
||||||
|
->setTags(['foobar' => ['attr' => 'bar']])
|
||||||
|
->setDecoratedService('foo')
|
||||||
|
;
|
||||||
|
|
||||||
|
$this->process($container);
|
||||||
|
|
||||||
|
$this->assertEquals(['container.service_locator' => [0 => []]], $container->getDefinition('baz.inner')->getTags());
|
||||||
|
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar']], $container->getDefinition('baz')->getTags());
|
||||||
|
}
|
||||||
|
|
||||||
protected function process(ContainerBuilder $container)
|
protected function process(ContainerBuilder $container)
|
||||||
{
|
{
|
||||||
$repeatedPass = new DecoratorServicePass();
|
$repeatedPass = new DecoratorServicePass();
|
||||||
|
Reference in New Issue
Block a user