From 1bb19536b6b40dfcedfa941fc5acc01eabbd3636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 16 Aug 2016 14:34:26 +0200 Subject: [PATCH 1/3] [DependencyInjection] Introduce a flag to enable setter autowiring --- .../Compiler/AutowirePass.php | 4 +++ .../DependencyInjection/Definition.php | 25 +++++++++++++++++++ .../Tests/Compiler/AutowirePassTest.php | 16 ++++++++++++ .../Tests/DefinitionTest.php | 8 ++++++ 4 files changed, 53 insertions(+) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 9a2f2ecba1865..09888801f8936 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -114,6 +114,10 @@ private function completeDefinition($id, Definition $definition) $this->autowireMethod($id, $definition, $constructor, true); } + if (!$definition->isSettersAutowired()) { + return; + } + $methodsCalled = array(); foreach ($definition->getMethodCalls() as $methodCall) { $methodsCalled[$methodCall[0]] = true; diff --git a/src/Symfony/Component/DependencyInjection/Definition.php b/src/Symfony/Component/DependencyInjection/Definition.php index b697f02708e1f..2bba6ae756b29 100644 --- a/src/Symfony/Component/DependencyInjection/Definition.php +++ b/src/Symfony/Component/DependencyInjection/Definition.php @@ -37,6 +37,7 @@ class Definition private $lazy = false; private $decoratedService; private $autowired = false; + private $settersAutowired = false; private $autowiringTypes = array(); protected $arguments; @@ -679,6 +680,30 @@ public function setAutowired($autowired) return $this; } + /** + * Are setters autowired? + * + * @return bool + */ + public function isSettersAutowired() + { + return $this->settersAutowired; + } + + /** + * Sets setters autowired. + * + * @param $settersAutowired + * + * @return Definition The current instance + */ + public function setSettersAutowired($settersAutowired) + { + $this->settersAutowired = $settersAutowired; + + return $this; + } + /** * Gets autowiring types that will default to this definition. * diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index 684e99b63228f..b4f699f53d4c8 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -441,6 +441,7 @@ public function testSetterInjection() $container ->register('setter_injection', SetterInjection::class) ->setAutowired(true) + ->setSettersAutowired(true) ->addMethodCall('setWithCallsConfigured', array('manual_arg1', 'manual_arg2')) ; @@ -470,6 +471,20 @@ public function testSetterInjection() ); } + public function testSetterInjectionNotEnabledByDefault() + { + $container = new ContainerBuilder(); + $container + ->register('setter_injection', SetterInjection::class) + ->setAutowired(true) + ; + + $pass = new AutowirePass(); + $pass->process($container); + + $this->assertCount(0, $container->getDefinition('setter_injection')->getMethodCalls()); + } + /** * @dataProvider getCreateResourceTests */ @@ -531,6 +546,7 @@ public function testSetterInjectionCollisionThrowsException() $container->register('c2', CollisionB::class); $aDefinition = $container->register('setter_injection_collision', SetterInjectionCollision::class); $aDefinition->setAutowired(true); + $aDefinition->setSettersAutowired(true); $pass = new AutowirePass(); $pass->process($container); diff --git a/src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php b/src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php index 35bc048c11626..ab3d201ff754d 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php @@ -292,6 +292,14 @@ public function testAutowired() $this->assertTrue($def->isAutowired()); } + public function testSettersAutowired() + { + $def = new Definition('stdClass'); + $this->assertFalse($def->isSettersAutowired()); + $def->setSettersAutowired(true); + $this->assertTrue($def->isSettersAutowired()); + } + public function testTypes() { $def = new Definition('stdClass'); From 148912cf9f430349c1fe6ffae9268c0bc09bcd5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 16 Aug 2016 16:25:43 +0200 Subject: [PATCH 2/3] Rename settersAutowired to autowiredSetters --- .../DependencyInjection/Compiler/AutowirePass.php | 2 +- .../Component/DependencyInjection/Definition.php | 12 ++++++------ .../Tests/Compiler/AutowirePassTest.php | 4 ++-- .../DependencyInjection/Tests/DefinitionTest.php | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 09888801f8936..8fce2bdd9b54c 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -114,7 +114,7 @@ private function completeDefinition($id, Definition $definition) $this->autowireMethod($id, $definition, $constructor, true); } - if (!$definition->isSettersAutowired()) { + if (!$definition->hasAutowiredSetters()) { return; } diff --git a/src/Symfony/Component/DependencyInjection/Definition.php b/src/Symfony/Component/DependencyInjection/Definition.php index 2bba6ae756b29..47d67003beca9 100644 --- a/src/Symfony/Component/DependencyInjection/Definition.php +++ b/src/Symfony/Component/DependencyInjection/Definition.php @@ -37,7 +37,7 @@ class Definition private $lazy = false; private $decoratedService; private $autowired = false; - private $settersAutowired = false; + private $autowiredSetters = false; private $autowiringTypes = array(); protected $arguments; @@ -685,21 +685,21 @@ public function setAutowired($autowired) * * @return bool */ - public function isSettersAutowired() + public function hasAutowiredSetters() { - return $this->settersAutowired; + return $this->autowiredSetters; } /** * Sets setters autowired. * - * @param $settersAutowired + * @param $autowiredSetters * * @return Definition The current instance */ - public function setSettersAutowired($settersAutowired) + public function setAutowiredSetters($autowiredSetters) { - $this->settersAutowired = $settersAutowired; + $this->autowiredSetters = $autowiredSetters; return $this; } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index b4f699f53d4c8..312d3bc86e075 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -441,7 +441,7 @@ public function testSetterInjection() $container ->register('setter_injection', SetterInjection::class) ->setAutowired(true) - ->setSettersAutowired(true) + ->setAutowiredSetters(true) ->addMethodCall('setWithCallsConfigured', array('manual_arg1', 'manual_arg2')) ; @@ -546,7 +546,7 @@ public function testSetterInjectionCollisionThrowsException() $container->register('c2', CollisionB::class); $aDefinition = $container->register('setter_injection_collision', SetterInjectionCollision::class); $aDefinition->setAutowired(true); - $aDefinition->setSettersAutowired(true); + $aDefinition->setAutowiredSetters(true); $pass = new AutowirePass(); $pass->process($container); diff --git a/src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php b/src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php index ab3d201ff754d..fc4205fe1a5e6 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php @@ -295,9 +295,9 @@ public function testAutowired() public function testSettersAutowired() { $def = new Definition('stdClass'); - $this->assertFalse($def->isSettersAutowired()); - $def->setSettersAutowired(true); - $this->assertTrue($def->isSettersAutowired()); + $this->assertFalse($def->hasAutowiredSetters()); + $def->setAutowiredSetters(true); + $this->assertTrue($def->hasAutowiredSetters()); } public function testTypes() From ca649aaa58834f1fd0d5d67f3a9404d90bdf0213 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 16 Aug 2016 16:30:46 +0200 Subject: [PATCH 3/3] Add missing support for YAML and XML loaders --- .../DependencyInjection/Loader/XmlFileLoader.php | 4 ++++ .../DependencyInjection/Loader/YamlFileLoader.php | 5 +++++ .../Loader/schema/dic/services/services-1.0.xsd | 1 + .../Tests/Fixtures/xml/services25.xml | 6 ++++++ .../Tests/Fixtures/yaml/services25.yml | 5 +++++ .../Tests/Loader/XmlFileLoaderTest.php | 9 +++++++++ .../Tests/Loader/YamlFileLoaderTest.php | 9 +++++++++ 7 files changed, 39 insertions(+) create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services25.xml create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services25.yml diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php index 6b1381b01201d..1f1eeb3ba923c 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php @@ -161,6 +161,10 @@ private function parseDefinition(\DOMElement $service, $file) $definition->setAutowired(XmlUtils::phpize($value)); } + if ($value = $service->getAttribute('autowire-setters')) { + $definition->setAutowiredSetters(XmlUtils::phpize($value)); + } + if ($files = $this->getChildren($service, 'file')) { $definition->setFile($files[0]->nodeValue); } diff --git a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php index 98e78efce8a06..4cab8f2ea1d03 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php @@ -54,6 +54,7 @@ class YamlFileLoader extends FileLoader 'decoration_inner_name' => 'decoration_inner_name', 'decoration_priority' => 'decoration_priority', 'autowire' => 'autowire', + 'autowire_setters' => 'autowire_setters', 'autowiring_types' => 'autowiring_types', ); @@ -305,6 +306,10 @@ private function parseDefinition($id, $service, $file) $definition->setAutowired($service['autowire']); } + if (isset($service['autowire_setters'])) { + $definition->setAutowiredSetters($service['autowire_setters']); + } + if (isset($service['autowiring_types'])) { if (is_string($service['autowiring_types'])) { $definition->addAutowiringType($service['autowiring_types']); diff --git a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd index 182e09e8572ce..92aacbd1388d1 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd +++ b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd @@ -114,6 +114,7 @@ + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services25.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services25.xml new file mode 100644 index 0000000000000..5ca2fd72de8d3 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services25.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services25.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services25.yml new file mode 100644 index 0000000000000..7b1d5e071c990 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services25.yml @@ -0,0 +1,5 @@ +services: + bar_service: + class: BarClass + autowire: true + autowire_setters: true diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php index a351c62ebc881..77478b3000288 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php @@ -556,6 +556,15 @@ public function testAutowire() $this->assertTrue($container->getDefinition('bar')->isAutowired()); } + public function testAutowireSetters() + { + $container = new ContainerBuilder(); + $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')); + $loader->load('services25.xml'); + + $this->assertTrue($container->getDefinition('bar')->hasAutowiredSetters()); + } + /** * @group legacy * @requires function Symfony\Bridge\PhpUnit\ErrorAssert::assertDeprecationsAreTriggered diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php index 13308a94a014a..4c18563ebe9de 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php @@ -325,6 +325,15 @@ public function testAutowire() $this->assertTrue($container->getDefinition('bar_service')->isAutowired()); } + public function testAutowireSetters() + { + $container = new ContainerBuilder(); + $loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')); + $loader->load('services25.yml'); + + $this->assertTrue($container->getDefinition('bar_service')->hasAutowiredSetters()); + } + /** * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException * @expectedExceptionMessage The value of the "decorates" option for the "bar" service must be the id of the service without the "@" prefix (replace "@foo" with "foo").