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 3289181

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

File tree

2 files changed

+53
-2
lines changed
Filter options

2 files changed

+53
-2
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
+47Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,53 @@ public function testProcessMergeAutowiringTypes()
364364
$this->assertEquals(array('Foo', 'Bar'), $def->getAutowiringTypes());
365365
}
366366

367+
public function testDecoratedServiceLoosesAutowiringTypesIfNonAbstract()
368+
{
369+
$container = new ContainerBuilder();
370+
371+
$container
372+
->register('parent')
373+
->addAutowiringType('Foo')
374+
;
375+
376+
$container
377+
->setDefinition('child', new DefinitionDecorator('parent'))
378+
->addAutowiringType('Bar')
379+
;
380+
381+
$this->process($container);
382+
383+
$childDef = $container->getDefinition('child');
384+
$this->assertEquals(array('Foo', 'Bar'), $childDef->getAutowiringTypes());
385+
386+
$parentDef = $container->getDefinition('parent');
387+
$this->assertSame(array(), $parentDef->getAutowiringTypes());
388+
}
389+
390+
public function testParentServiceKeepsAutowiringTypesIfAbstract()
391+
{
392+
$container = new ContainerBuilder();
393+
394+
$container
395+
->register('parent')
396+
->addAutowiringType('Foo')
397+
->setAbstract(true)
398+
;
399+
400+
$container
401+
->setDefinition('child', new DefinitionDecorator('parent'))
402+
->addAutowiringType('Bar')
403+
;
404+
405+
$this->process($container);
406+
407+
$childDef = $container->getDefinition('child');
408+
$this->assertEquals(array('Foo', 'Bar'), $childDef->getAutowiringTypes());
409+
410+
$parentDef = $container->getDefinition('parent');
411+
$this->assertEquals($childDef->getAutowiringTypes(), $parentDef->getAutowiringTypes());
412+
}
413+
367414
protected function process(ContainerBuilder $container)
368415
{
369416
$pass = new ResolveDefinitionTemplatesPass();

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.