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

Skip to content

Commit 6fb2d52

Browse files
bug #35214 [DI] DecoratorServicePass should keep container.service_locator on the decorated definition (malarzm)
This PR was merged into the 4.3 branch. Discussion ---------- [DI] DecoratorServicePass should keep container.service_locator on the decorated definition | Q | A | ------------- | --- | Branch? | 4.3 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | Fix #33670 (comment) | License | MIT | Doc PR | - `container.service_locator` is special because it tells how the arguments of the constructor should be interpreted. /cc @malarzm Commits ------- 99dab87 [DI] DecoratorServicePass should keep container.service_locator on the decorated definition
2 parents ccfc4b6 + 99dab87 commit 6fb2d52

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,18 @@ public function process(ContainerBuilder $container)
6464

6565
if (isset($decoratingDefinitions[$inner])) {
6666
$decoratingDefinition = $decoratingDefinitions[$inner];
67-
$definition->setTags(array_merge($decoratingDefinition->getTags(), $definition->getTags()));
68-
$decoratingDefinition->setTags([]);
67+
68+
$decoratingTags = $decoratingDefinition->getTags();
69+
$resetTags = [];
70+
71+
if (isset($decoratingTags['container.service_locator'])) {
72+
// container.service_locator has special logic and it must not be transferred out to decorators
73+
$resetTags = ['container.service_locator' => $decoratingTags['container.service_locator']];
74+
unset($decoratingTags['container.service_locator']);
75+
}
76+
77+
$definition->setTags(array_merge($decoratingTags, $definition->getTags()));
78+
$decoratingDefinition->setTags($resetTags);
6979
$decoratingDefinitions[$inner] = $definition;
7080
}
7181

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,25 @@ public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitio
167167
$this->assertEquals(['bar' => ['attr' => 'baz']], $container->getDefinition('deco2')->getTags());
168168
}
169169

170+
public function testProcessLeavesServiceLocatorTagOnOriginalDefinition()
171+
{
172+
$container = new ContainerBuilder();
173+
$container
174+
->register('foo')
175+
->setTags(['container.service_locator' => [0 => []], 'bar' => ['attr' => 'baz']])
176+
;
177+
$container
178+
->register('baz')
179+
->setTags(['foobar' => ['attr' => 'bar']])
180+
->setDecoratedService('foo')
181+
;
182+
183+
$this->process($container);
184+
185+
$this->assertEquals(['container.service_locator' => [0 => []]], $container->getDefinition('baz.inner')->getTags());
186+
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar']], $container->getDefinition('baz')->getTags());
187+
}
188+
170189
protected function process(ContainerBuilder $container)
171190
{
172191
$repeatedPass = new DecoratorServicePass();

0 commit comments

Comments
 (0)