[DependencyInjection] added support for anonymous services as properties (closes #2964)
This commit is contained in:
parent
23b5e60436
commit
43249dea5f
@ -228,8 +228,8 @@ class XmlFileLoader extends FileLoader
|
||||
$definitions = array();
|
||||
$count = 0;
|
||||
|
||||
// anonymous services as arguments
|
||||
if (false !== $nodes = $xml->xpath('//container:argument[@type="service"][not(@id)]')) {
|
||||
// anonymous services as arguments/properties
|
||||
if (false !== $nodes = $xml->xpath('//container:argument[@type="service"][not(@id)]|//container:property[@type="service"][not(@id)]')) {
|
||||
foreach ($nodes as $node) {
|
||||
// give it a unique name
|
||||
$node['id'] = sprintf('%s_%d', md5($file), ++$count);
|
||||
|
@ -118,6 +118,9 @@
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="property" mixed="true">
|
||||
<xsd:choice minOccurs="0" maxOccurs="1">
|
||||
<xsd:element name="service" type="service" />
|
||||
</xsd:choice>
|
||||
<xsd:attribute name="type" type="argument_type" />
|
||||
<xsd:attribute name="id" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
|
@ -13,6 +13,9 @@
|
||||
</argument>
|
||||
</service>
|
||||
</argument>
|
||||
<property name="p" type="service">
|
||||
<service class="BazClass" />
|
||||
</property>
|
||||
</service>
|
||||
</services>
|
||||
</container>
|
||||
|
@ -122,7 +122,9 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
|
||||
$loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
|
||||
$loader->load('services5.xml');
|
||||
$services = $container->getDefinitions();
|
||||
$this->assertEquals(3, count($services), '->load() attributes unique ids to anonymous services');
|
||||
$this->assertEquals(4, count($services), '->load() attributes unique ids to anonymous services');
|
||||
|
||||
// anonymous service as an argument
|
||||
$args = $services['foo']->getArguments();
|
||||
$this->assertEquals(1, count($args), '->load() references anonymous services as "normal" ones');
|
||||
$this->assertEquals('Symfony\\Component\\DependencyInjection\\Reference', get_class($args[0]), '->load() converts anonymous services to references to "normal" services');
|
||||
@ -130,12 +132,21 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
|
||||
$inner = $services[(string) $args[0]];
|
||||
$this->assertEquals('BarClass', $inner->getClass(), '->load() uses the same configuration as for the anonymous ones');
|
||||
|
||||
// inner anonymous services
|
||||
$args = $inner->getArguments();
|
||||
$this->assertEquals(1, count($args), '->load() references anonymous services as "normal" ones');
|
||||
$this->assertEquals('Symfony\\Component\\DependencyInjection\\Reference', get_class($args[0]), '->load() converts anonymous services to references to "normal" services');
|
||||
$this->assertTrue(isset($services[(string) $args[0]]), '->load() makes a reference to the created ones');
|
||||
$inner = $services[(string) $args[0]];
|
||||
$this->assertEquals('BazClass', $inner->getClass(), '->load() uses the same configuration as for the anonymous ones');
|
||||
|
||||
// anonymous service as a property
|
||||
$properties = $services['foo']->getProperties();
|
||||
$property = $properties['p'];
|
||||
$this->assertEquals('Symfony\\Component\\DependencyInjection\\Reference', get_class($property), '->load() converts anonymous services to references to "normal" services');
|
||||
$this->assertTrue(isset($services[(string) $property]), '->load() makes a reference to the created ones');
|
||||
$inner = $services[(string) $property];
|
||||
$this->assertEquals('BazClass', $inner->getClass(), '->load() uses the same configuration as for the anonymous ones');
|
||||
}
|
||||
|
||||
public function testLoadServices()
|
||||
|
Reference in New Issue
Block a user