bug #20207 [DependencyInjection] move tags from decorated to decorating service (xabbuh)

This PR was merged into the 2.7 branch.

Discussion
----------

[DependencyInjection] move tags from decorated to decorating service

| Q             | A
| ------------- | ---
| Branch?       | 2.7
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #20150
| License       | MIT
| Doc PR        |

Commits
-------

7def83c move tags from decorated to decorating service
This commit is contained in:
Fabien Potencier 2016-10-14 07:09:04 -07:00
commit 7e2f24fc6f
2 changed files with 24 additions and 4 deletions

View File

@ -42,10 +42,12 @@ class DecoratorServicePass implements CompilerPassInterface
$public = $alias->isPublic(); $public = $alias->isPublic();
$container->setAlias($renamedId, new Alias((string) $alias, false)); $container->setAlias($renamedId, new Alias((string) $alias, false));
} else { } else {
$definition = $container->getDefinition($inner); $decoratedDefinition = $container->getDefinition($inner);
$public = $definition->isPublic(); $definition->setTags($decoratedDefinition->getTags(), $definition->getTags());
$definition->setPublic(false); $public = $decoratedDefinition->isPublic();
$container->setDefinition($renamedId, $definition); $decoratedDefinition->setPublic(false);
$decoratedDefinition->setTags(array());
$container->setDefinition($renamedId, $decoratedDefinition);
} }
$container->setAlias($inner, new Alias($id, $public)); $container->setAlias($inner, new Alias($id, $public));

View File

@ -82,6 +82,24 @@ class DecoratorServicePassTest extends \PHPUnit_Framework_TestCase
$this->assertNull($fooExtendedDefinition->getDecoratedService()); $this->assertNull($fooExtendedDefinition->getDecoratedService());
} }
public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinition()
{
$container = new ContainerBuilder();
$container
->register('foo')
->setTags(array('name' => 'bar'))
;
$container
->register('baz')
->setDecoratedService('foo')
;
$this->process($container);
$this->assertEmpty($container->getDefinition('baz.inner')->getTags());
$this->assertEquals(array('name' => 'bar'), $container->getDefinition('baz')->getTags());
}
protected function process(ContainerBuilder $container) protected function process(ContainerBuilder $container)
{ {
$repeatedPass = new DecoratorServicePass(); $repeatedPass = new DecoratorServicePass();