Autoconfig: don't automatically tag decorators

This commit is contained in:
Kévin Dunglas 2019-03-01 10:40:47 +01:00 committed by Fabien Potencier
parent 7535383163
commit 05ecf829fe
2 changed files with 32 additions and 7 deletions

View File

@ -113,14 +113,17 @@ class ResolveInstanceofConditionalsPass implements CompilerPassInterface
$definition->setShared($shared); $definition->setShared($shared);
} }
$i = \count($instanceofTags); // Don't add tags to service decorators
while (0 <= --$i) { if (null === $definition->getDecoratedService()) {
foreach ($instanceofTags[$i] as $k => $v) { $i = \count($instanceofTags);
foreach ($v as $v) { while (0 <= --$i) {
if ($definition->hasTag($k) && \in_array($v, $definition->getTag($k))) { foreach ($instanceofTags[$i] as $k => $v) {
continue; foreach ($v as $v) {
if ($definition->hasTag($k) && \in_array($v, $definition->getTag($k))) {
continue;
}
$definition->addTag($k, $v);
} }
$definition->addTag($k, $v);
} }
} }
} }

View File

@ -307,4 +307,26 @@ class ResolveInstanceofConditionalsPassTest extends TestCase
$this->assertInstanceOf(BoundArgument::class, $bindings['$toto']); $this->assertInstanceOf(BoundArgument::class, $bindings['$toto']);
$this->assertSame(123, $bindings['$toto']->getValues()[0]); $this->assertSame(123, $bindings['$toto']->getValues()[0]);
} }
public function testDecoratorsAreNotAutomaticallyTagged()
{
$container = new ContainerBuilder();
$decorator = $container->register('decorator', self::class);
$decorator->setDecoratedService('decorated');
$decorator->setInstanceofConditionals([
parent::class => (new ChildDefinition(''))->addTag('tag'),
]);
$decorator->setAutoconfigured(true);
$decorator->addTag('manual');
$container->registerForAutoconfiguration(parent::class)
->addTag('tag')
;
(new ResolveInstanceofConditionalsPass())->process($container);
(new ResolveChildDefinitionsPass())->process($container);
$this->assertSame(['manual' => [[]]], $container->getDefinition('decorator')->getTags());
}
} }