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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy