Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 549eb14

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

File tree

2 files changed

+67
-25
lines changed
Filter options

2 files changed

+67
-25
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php
+6-2Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php
+61-23Lines 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)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.