From 71d502a174924920b7522ac86d62e0976b104b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 3 Nov 2015 11:42:49 -0800 Subject: [PATCH 1/2] [DependencyInjection] Autowiring: support parent/decorators --- .../Compiler/AutowirePass.php | 8 ++++---- .../ResolveDefinitionTemplatesPass.php | 6 ++++++ .../Tests/Compiler/AutowirePassTest.php | 2 +- .../ResolveDefinitionTemplatesPassTest.php | 20 +++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 1a20831e89055..d07e91a93e176 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 ab5f702d26d4d..62ed326b4b207 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 e5fcdc2853daa..85beebe553782 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 675630933d555..c1fff28b60af7 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(); From faefc6074f4f31e2b143c22fdef932b545723f53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 3 Nov 2015 16:40:26 -0800 Subject: [PATCH 2/2] [DependencyInjection] Autowing: exclude abstract definitons --- .../DependencyInjection/Compiler/AutowirePass.php | 6 ++++++ .../Tests/Compiler/AutowirePassTest.php | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index d07e91a93e176..81470a8398eed 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -138,11 +138,17 @@ private function populateAvailableTypes() */ private function populateAvailableType($id, Definition $definition) { + // Never use abstract services + if ($definition->isAbstract()) { + return; + } + foreach ($definition->getAutowiringTypes() as $type) { $this->definedTypes[$type] = true; $this->types[$type] = $id; } + // Cannot use reflection if the class isn't set if (!$definition->getClass()) { return; } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index 85beebe553782..cc29ea93e02f2 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -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 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