Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 90f8df2

Browse files
Soner Sayakcinicolas-grekas
Soner Sayakci
authored andcommitted
[DependencyInjection] Fix tags on multiple decorated service
1 parent 80670fc commit 90f8df2

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php

Lines changed: 16 additions & 8 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();
@@ -53,18 +54,25 @@ public function process(ContainerBuilder $container)
5354
$container->setAlias($renamedId, new Alias($container->normalizeId($alias), false));
5455
} else {
5556
$decoratedDefinition = $container->getDefinition($inner);
56-
$definition->setTags(array_merge($decoratedDefinition->getTags(), $definition->getTags()));
57-
if ($types = array_merge($decoratedDefinition->getAutowiringTypes(false), $definition->getAutowiringTypes(false))) {
58-
$definition->setAutowiringTypes($types);
59-
}
6057
$public = $decoratedDefinition->isPublic();
6158
$private = $decoratedDefinition->isPrivate();
6259
$decoratedDefinition->setPublic(false);
63-
$decoratedDefinition->setTags(array());
64-
if ($decoratedDefinition->getAutowiringTypes(false)) {
65-
$decoratedDefinition->setAutowiringTypes(array());
66-
}
6760
$container->setDefinition($renamedId, $decoratedDefinition);
61+
$decoratingDefinitions[$inner] = $decoratedDefinition;
62+
}
63+
64+
if (isset($decoratingDefinitions[$inner])) {
65+
$decoratingDefinition = $decoratingDefinitions[$inner];
66+
$definition->setTags(array_merge($decoratingDefinition->getTags(), $definition->getTags()));
67+
$autowiringTypes = $decoratingDefinition->getAutowiringTypes(false);
68+
if ($types = array_merge($autowiringTypes, $definition->getAutowiringTypes(false))) {
69+
$definition->setAutowiringTypes($types);
70+
}
71+
$decoratingDefinition->setTags(array());
72+
if ($autowiringTypes) {
73+
$decoratingDefinition->setAutowiringTypes(array());
74+
}
75+
$decoratingDefinitions[$inner] = $definition;
6876
}
6977

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

src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,29 @@ public function testProcessMergesAutowiringTypesInDecoratingDefinitionAndRemoveT
168168
$this->assertEmpty($container->getDefinition('child.inner')->getAutowiringTypes());
169169
}
170170

171+
public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitionMultipleTimes()
172+
{
173+
$container = new ContainerBuilder();
174+
$container
175+
->register('foo')
176+
->setPublic(true)
177+
->setTags(array('bar' => array('attr' => 'baz')))
178+
;
179+
$container
180+
->register('deco1')
181+
->setDecoratedService('foo', null, 50)
182+
;
183+
$container
184+
->register('deco2')
185+
->setDecoratedService('foo', null, 2)
186+
;
187+
188+
$this->process($container);
189+
190+
$this->assertEmpty($container->getDefinition('deco1')->getTags());
191+
$this->assertEquals(array('bar' => array('attr' => 'baz')), $container->getDefinition('deco2')->getTags());
192+
}
193+
171194
protected function process(ContainerBuilder $container)
172195
{
173196
$repeatedPass = new DecoratorServicePass();

0 commit comments

Comments
 (0)