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").