Skip to content

Commit 83f612d

Browse files
Merge branch '4.1'
* 4.1: [DependencyInjection] Fix tags on multiple decorated service fix merge SCA: reverted code style changes SCA: reverted code style changes SCA: applied requested code style changes SCA: simplify some ifs in favour of null coalescing operator
2 parents fece676 + e72ee2c commit 83f612d

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

Compiler/DecoratorServicePass.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public function process(ContainerBuilder $container)
3434
}
3535
$definitions->insert(array($id, $definition), array($decorated[2], --$order));
3636
}
37+
$decoratingDefinitions = array();
3738

3839
foreach ($definitions as list($id, $definition)) {
3940
list($inner, $renamedId) = $definition->getDecoratedService();
@@ -54,12 +55,18 @@ public function process(ContainerBuilder $container)
5455
$container->setAlias($renamedId, new Alias((string) $alias, false));
5556
} else {
5657
$decoratedDefinition = $container->getDefinition($inner);
57-
$definition->setTags(array_merge($decoratedDefinition->getTags(), $definition->getTags()));
5858
$public = $decoratedDefinition->isPublic();
5959
$private = $decoratedDefinition->isPrivate();
6060
$decoratedDefinition->setPublic(false);
61-
$decoratedDefinition->setTags(array());
6261
$container->setDefinition($renamedId, $decoratedDefinition);
62+
$decoratingDefinitions[$inner] = $decoratedDefinition;
63+
}
64+
65+
if (isset($decoratingDefinitions[$inner])) {
66+
$decoratingDefinition = $decoratingDefinitions[$inner];
67+
$definition->setTags(array_merge($decoratingDefinition->getTags(), $definition->getTags()));
68+
$decoratingDefinition->setTags(array());
69+
$decoratingDefinitions[$inner] = $definition;
6370
}
6471

6572
$container->setAlias($inner, $id)->setPublic($public)->setPrivate($private);

Tests/Compiler/DecoratorServicePassTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,29 @@ public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitio
144144
$this->assertEquals(array('bar' => array('attr' => 'baz'), 'foobar' => array('attr' => 'bar')), $container->getDefinition('baz')->getTags());
145145
}
146146

147+
public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitionMultipleTimes()
148+
{
149+
$container = new ContainerBuilder();
150+
$container
151+
->register('foo')
152+
->setPublic(true)
153+
->setTags(array('bar' => array('attr' => 'baz')))
154+
;
155+
$container
156+
->register('deco1')
157+
->setDecoratedService('foo', null, 50)
158+
;
159+
$container
160+
->register('deco2')
161+
->setDecoratedService('foo', null, 2)
162+
;
163+
164+
$this->process($container);
165+
166+
$this->assertEmpty($container->getDefinition('deco1')->getTags());
167+
$this->assertEquals(array('bar' => array('attr' => 'baz')), $container->getDefinition('deco2')->getTags());
168+
}
169+
147170
protected function process(ContainerBuilder $container)
148171
{
149172
$repeatedPass = new DecoratorServicePass();

0 commit comments

Comments
 (0)