diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 1a20831e8905..d07e91a93e17 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -138,15 +138,15 @@ private function populateAvailableTypes() */ private function populateAvailableType($id, Definition $definition) { - if (!$definition->getClass()) { - return; - } - foreach ($definition->getAutowiringTypes() as $type) { $this->definedTypes[$type] = true; $this->types[$type] = $id; } + if (!$definition->getClass()) { + return; + } + if ($reflectionClass = $this->getReflectionClass($id, $definition)) { $this->extractInterfaces($id, $reflectionClass); $this->extractAncestors($id, $reflectionClass); diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php index ab5f702d26d4..62ed326b4b20 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php @@ -118,6 +118,7 @@ private function resolveDefinition(ContainerBuilder $container, DefinitionDecora $def->setArguments($parentDef->getArguments()); $def->setMethodCalls($parentDef->getMethodCalls()); $def->setProperties($parentDef->getProperties()); + $def->setAutowiringTypes($parentDef->getAutowiringTypes()); if ($parentDef->getFactoryClass(false)) { $def->setFactoryClass($parentDef->getFactoryClass(false)); } @@ -202,6 +203,11 @@ private function resolveDefinition(ContainerBuilder $container, DefinitionDecora $def->setMethodCalls(array_merge($def->getMethodCalls(), $calls)); } + // merge autowiring types + foreach ($definition->getAutowiringTypes() as $autowiringType) { + $def->addAutowiringType($autowiringType); + } + // these attributes are always taken from the child $def->setAbstract($definition->isAbstract()); $def->setScope($definition->getScope(false), false); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index e5fcdc2853da..85beebe55378 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -189,7 +189,7 @@ public function testOptionalParameter() $this->assertEquals('foo', $definition->getArgument(2)); } - public function testDontTriggeruAutowiring() + public function testDontTriggerAutowiring() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php index 675630933d55..c1fff28b60af 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php @@ -274,6 +274,26 @@ public function testDecoratedServiceCanOverwriteDeprecatedParentStatus() $this->assertFalse($container->getDefinition('decorated_deprecated_parent')->isDeprecated()); } + public function testProcessMergeAutowiringTypes() + { + $container = new ContainerBuilder(); + + $container + ->register('parent') + ->addAutowiringType('Foo') + ; + + $container + ->setDefinition('child', new DefinitionDecorator('parent')) + ->addAutowiringType('Bar') + ; + + $this->process($container); + + $def = $container->getDefinition('child'); + $this->assertEquals(array('Foo', 'Bar'), $def->getAutowiringTypes()); + } + protected function process(ContainerBuilder $container) { $pass = new ResolveDefinitionTemplatesPass();