[DependencyInjection] added support for anonymous services as properties (closes #2964)

This commit is contained in:
Fabien Potencier 2012-05-07 12:25:27 +02:00
parent 23b5e60436
commit 43249dea5f
4 changed files with 20 additions and 3 deletions

View File

@ -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);

View File

@ -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" />

View File

@ -13,6 +13,9 @@
</argument>
</service>
</argument>
<property name="p" type="service">
<service class="BazClass" />
</property>
</service>
</services>
</container>

View File

@ -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()