8000 A non-abstract service should not keep the autowiring types if decorated · symfony/symfony@549eb14 · GitHub
[go: up one dir, main page]

Skip to content

Commit 549eb14

Browse files
committed
A non-abstract service should not keep the autowiring types if decorated
1 parent 5a08a32 commit 549eb14

File tree

2 files changed

+67
-25
lines changed

2 files changed

+67
-25
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,12 @@ private function resolveDefinition(ContainerBuilder $container, DefinitionDecora
208208
}
209209

210210
// merge autowiring types
211-
foreach ($definition->getAutowiringTypes() as $autowiringType) {
212-
$def->addAutowiringType($autowiringType);
211+
$def->setAutowiringTypes($definition->getAutowiringTypes());
212+
213+
// if the decorated service is not abstract, remove its autowiring types so the decorator
214+
// will be used for autowiring services
215+
if (!$definition->isAbstract()) {
216+
$definition->setAutowiringTypes(array());
213217
}
214218

215219
// these attributes are always taken from the child

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

Lines changed: 61 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Symfony\Component\DependencyInjection\Tests\Compiler;
1313

14-
use Symfony\Component\DependencyInjection\ContainerInterface;
1514
use Symfony\Component\DependencyInjection\DefinitionDecorator;
1615
use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
1716
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -79,28 +78,6 @@ public function testProcessDoesNotCopyAbstract()
7978
$this->assertFalse($def->isAbstract());
8079
}
8180

82-
/**
83-
* @group legacy
84-
*/
85-
public function testProcessDoesNotCopyScope()
86-
{
87-
$container = new ContainerBuilder();
88-
89-
$container
90-
->register('parent')
91-
->setScope('foo')
92-
;
93-
94-
$container
95-
->setDefinition('child', new DefinitionDecorator('parent'))
96-
;
97-
98-
$this->process($container);
99-
100-
$def = $container->getDefinition('child');
101-
$this->assertEquals(ContainerInterface::SCOPE_CONTAINER, $def->getScope());
102-
}
103-
10481
public function testProcessDoesNotCopyShared()
10582
{
10683
$container = new ContainerBuilder();
@@ -364,6 +341,67 @@ public function testProcessMergeAutowiringTypes()
364341
$this->assertEquals(array('Foo', 'Bar'), $def->getAutowiringTypes());
365342
}
366343

344+
public function testDecoratedServiceLoosesAutowiringTypesIfNonAbstract()
345+
{
346+
$container = new ContainerBuilder();
347+
348+
$container
349+
->register('parent')
350+
->addAutowiringType('Foo')
351+
;
352+
353+
$container
354+
->setDefinition('child', new DefinitionDecorator('parent'))
355+
->addAutowiringType('Bar')
356+
;
357+
358+
$this->process($container);
359+
360+
$childDef = $container->getDefinition('child');
361+
$this->assertEquals(array('Foo', 'Bar'), $childDef->getAutowiringTypes());
362+
363+
$parentDef = $container->getDefinition('parent');
364+
$this->assertSame(array(), $parentDef->getAutowiringTypes());
365+
}
366+
367+
public function testParentServiceKeepsAutowiringTypesIfAbstract()
368+
{
369+
$container = new ContainerBuilder();
370+
371+
$container
372+
->register('parent')
373+
->addAutowiringType('Foo')
374+
->setAbstract(true)
375+
;
376+
377+
$container
378+
->setDefinition('child', new DefinitionDecorator('parent'))
379+
->addAutowiringType('Bar')
380+
;
381+
382+
$this->process($container);
383+
384+
$childDef = $container->getDefinition('child');
385+
$this->assertEquals(array('Foo', 'Bar'), $childDef->getAutowiringTypes());
386+
387+
$parentDef = $container->getDefinition('parent');
388+
$this->assertEquals($childDef->getAutowiringTypes(), $parentDef->getAutowiringTypes());
389+
}
390+
391+
public function testProcessResolvesAliases()
392+
{
393+
$container = new ContainerBuilder();
394+
395+
$container->register('parent', 'ParentClass');
396+
$container->setAlias('parent_alias', 'parent');
397+
$container->setDefinition('child', new DefinitionDecorator('parent_alias'));
398+
399+
$this->process($container);
400+
401+
$def = $container->getDefinition('child');
402+
$this->assertSame('ParentClass', $def->getClass());
403+
}
404+
367405
protected function process(ContainerBuilder $container)
368406
{
369407
$pass = new ResolveDefinitionTemplatesPass();

0 commit comments

Comments
 (0)
0