diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 9a2f2ecba1865..8fce2bdd9b54c 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->hasAutowiredSetters()) { + 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..47d67003beca9 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 $autowiredSetters = false; private $autowiringTypes = array(); protected $arguments; @@ -679,6 +680,30 @@ public function setAutowired($autowired) return $this; } + /** + * Are setters autowired? + * + * @return bool + */ + public function hasAutowiredSetters() + { + return $this->autowiredSetters; + } + + /** + * Sets setters autowired. + * + * @param $autowiredSetters + * + * @return Definition The current instance + */ + public function setAutowiredSetters($autowiredSetters) + { + $this->autowiredSetters = $autowiredSetters; + + return $this; + } + /** * Gets autowiring types that will default to this definition. * 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/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index 684e99b63228f..312d3bc86e075 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) + ->setAutowiredSetters(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->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 35bc048c11626..fc4205fe1a5e6 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->hasAutowiredSetters()); + $def->setAutowiredSetters(true); + $this->assertTrue($def->hasAutowiredSetters()); + } + public function testTypes() { $def = new Definition('stdClass'); 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").