diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 1a20831e89..81470a8398 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -138,7 +138,8 @@ class AutowirePass implements CompilerPassInterface */ private function populateAvailableType($id, Definition $definition) { - if (!$definition->getClass()) { + // Never use abstract services + if ($definition->isAbstract()) { return; } @@ -147,6 +148,11 @@ class AutowirePass implements CompilerPassInterface $this->types[$type] = $id; } + // Cannot use reflection if the class isn't set + 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 ab5f702d26..62ed326b4b 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php @@ -118,6 +118,7 @@ class ResolveDefinitionTemplatesPass implements CompilerPassInterface $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 @@ class ResolveDefinitionTemplatesPass implements CompilerPassInterface $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 e5fcdc2853..cc29ea93e0 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -189,7 +189,7 @@ class AutowirePassTest extends \PHPUnit_Framework_TestCase $this->assertEquals('foo', $definition->getArgument(2)); } - public function testDontTriggeruAutowiring() + public function testDontTriggerAutowiring() { $container = new ContainerBuilder(); @@ -216,6 +216,21 @@ class AutowirePassTest extends \PHPUnit_Framework_TestCase $pass = new AutowirePass(); $pass->process($container); } + + public function testDontUseAbstractServices() + { + $container = new ContainerBuilder(); + + $container->register('abstract_foo', __NAMESPACE__.'\Foo')->setAbstract(true); + $container->register('foo', __NAMESPACE__.'\Foo'); + $container->register('bar', __NAMESPACE__.'\Bar')->setAutowired(true); + + $pass = new AutowirePass(); + $pass->process($container); + + $arguments = $container->getDefinition('bar')->getArguments(); + $this->assertSame('foo', (string) $arguments[0]); + } } class Foo diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php index 675630933d..c1fff28b60 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php @@ -274,6 +274,26 @@ class ResolveDefinitionTemplatesPassTest extends \PHPUnit_Framework_TestCase $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();