8000 [DependencyInjection] Autowiring: support parent/decorators · symfony/symfony@71d502a · GitHub
[go: up one dir, main page]

Skip to content

Commit 71d502a

Browse files
committed
[DependencyInjection] Autowiring: support parent/decorators
1 parent 8c4e756 commit 71d502a

File tree

4 files changed

+31
-5
lines changed

4 files changed

+31
-5
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,15 @@ private function populateAvailableTypes()
138138
*/
139139
private function populateAvailableType($id, Definition $definition)
140140
{
141-
if (!$definition->getClass()) {
142-
return;
143-
}
144-
145141
foreach ($definition->getAutowiringTypes() as $type) {
146142
$this->definedTypes[$type] = true;
147143
$this->types[$type] = $id;
148144
}
149145

146+
if (!$definition->getClass()) {
147+
return;
148+
}
149+
150150
if ($reflectionClass = $this->getReflectionClass($id, $definition)) {
151151
$this->extractInterfaces($id, $reflectionClass);
152152
$this->extractAncestors($id, $reflectionClass);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ private function resolveDefinition(ContainerBuilder $container, DefinitionDecora
118118
$def->setArguments($parentDef->getArguments());
119119
$def->setMethodCalls($parentDef->getMethodCalls());
120120
$def->setProperties($parentDef->getProperties());
121+
$def->setAutowiringTypes($parentDef->getAutowiringTypes());
121122
if ($parentDef->getFactoryClass(false)) {
122123
$def->setFactoryClass($parentDef->getFactoryClass(false));
123124
}
@@ -202,6 +203,11 @@ private function resolveDefinition(ContainerBuilder $container, DefinitionDecora
202203
$def->setMethodCalls(array_merge($def->getMethodCalls(), $calls));
203204
}
204205

206+
// merge autowiring types
207+
foreach ($definition->getAutowiringTypes() as $autowiringType) {
208+
$def->addAutowiringType($autowiringType);
209+
}
210+
205211
// these attributes are always taken from the child
206212
$def->setAbstract($definition->isAbstract());
207213
$def->setScope($definition->getScope(false), false);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public function testOptionalParameter()
189189
$this->assertEquals('foo', $definition->getArgument(2));
190190
}
191191

192-
public function testDontTriggeruAutowiring()
192+
public function testDontTriggerAutowiring()
193193
{
194194
$container = new ContainerBuilder();
195195

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,26 @@ public function testDecoratedServiceCanOverwriteDeprecatedParentStatus()
274274
$this->assertFalse($container->getDefinition('decorated_deprecated_parent')->isDeprecated());
275275
}
276276

277+
public function testProcessMergeAutowiringTypes()
278+
{
279+
$container = new ContainerBuilder();
280+
281+
$container
282+
->register('parent')
283+
->addAutowiringType('Foo')
284+
;
285+
286+
$container
287+
->setDefinition('child', new DefinitionDecorator('parent'))
288+
->addAutowiringType('Bar')
289+
;
290+
291+
$this->process($container);
292+
293+
$def = $container->getDefinition('child');
294+
$this->assertEquals(array('Foo', 'Bar'), $def->getAutowiringTypes());
295+
}
296+
277297
protected function process(ContainerBuilder $container)
278298
{
279299
$pass = new ResolveDefinitionTemplatesPass();

0 commit comments

Comments
 (0)
0