diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 1a20831e8905..81470a8398ee 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -138,7 +138,8 @@ private function populateAvailableTypes() */ private function populateAvailableType($id, Definition $definition) { - if (!$definition->getClass()) { + // Never use abstract services + if ($definition->isAbstract()) { return; } @@ -147,6 +148,11 @@ private function populateAvailableType($id, Definition $definition) $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 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..cc29ea93e02f 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(); @@ -216,6 +216,21 @@ public function testClassNotFoundThrowsException() $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 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(); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy