8000 [DI] Fix anonymous factories/configurators support · symfony/symfony@dda43ed · GitHub
[go: up one dir, main page]

Skip to content

Commit dda43ed

Browse files
GuilhemNfabpot
authored andcommitted
[DI] Fix anonymous factories/configurators support
1 parent 47740ce commit dda43ed

File tree

2 files changed

+23
-28
lines changed

2 files changed

+23
-28
lines changed

src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -259,11 +259,7 @@ private function parseDefinition(\DOMElement $service, $file, array $defaults =
259259
if ($function = $factory->getAttribute('function')) {
260260
$definition->setFactory($function);
261261
} else {
262-
$factoryService = $this->getChildren($factory, 'service');
263-
264-
if (isset($factoryService[0])) {
265-
$class = $this->parseDefinition($factoryService[0], $file);
266-
} elseif ($childService = $factory->getAttribute('service')) {
262+
if ($childService = $factory->getAttribute('service')) {
267263
$class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE);
268264
} else {
269265
$class = $factory->hasAttribute('class') ? $factory->getAttribute('class') : null;
@@ -278,11 +274,7 @@ private function parseDefinition(\DOMElement $service, $file, array $defaults =
278274
if ($function = $configurator->getAttribute('function')) {
279275
$definition->setConfigurator($function);
280276
} else {
281-
$configuratorService = $this->getChildren($configurator, 'service');
282-
283-
if (isset($configuratorService[0])) {
284-
$class = $this->parseDefinition($configuratorService[0], $file);
285-
} elseif ($childService = $configurator->getAttribute('service')) {
277+
if ($childService = $configurator->getAttribute('service')) {
286278
$class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE);
287279
} else {
288280
$class = $configurator->getAttribute('class');
@@ -379,13 +371,14 @@ private function processAnonymousServices(\DOMDocument $xml, $file)
379371
$xpath->registerNamespace('container', self::NS);
380372

381373
// anonymous services as arguments/properties
382-
if (false !== $nodes = $xpath->query('//container:argument[@type="service"][not(@id)]|//container:property[@type="service"][not(@id)]')) {
374+
if (false !== $nodes = $xpath->query('//container:argument[@type="service"][not(@id)]|//container:property[@type="service"][not(@id)]|//container:factory[not(@service)]|//container:configurator[not(@service)]')) {
383375
foreach ($nodes as $node) {
384-
// give it a unique name
385-
$id = sprintf('%d_%s', ++$count, hash('sha256', $file));
386-
$node->setAttribute('id', $id);
387-
388376
if ($services = $this->getChildren($node, 'service')) {
377+
// give it a unique name
378+
$id = sprintf('%d_%s', ++$count, hash('sha256', $file));
379+
$node->setAttribute('id', $id);
380+
$node->setAttribute('service', $id);
381+
389382
$definitions[$id] = array($services[0], $file, false);
390383
$services[0]->setAttribute('id', $id);
391384

@@ -417,8 +410,6 @@ private function processAnonymousServices(\DOMDocument $xml, $file)
417410
$tmpDomElement = new \DOMElement('_services', null, self::NS);
418411
$domElement->parentNode->replaceChild($tmpDomElement, $domElement);
419412
$tmpDomElement->setAttribute('id', $id);
420-
} else {
421-
$domElement->parentNode->removeChild($domElement);
422413
}
423414
}
424415
}

src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
16-
use Symfony\Component\DependencyInjection\ContainerInterface;
1716
use Symfony\Component\DependencyInjection\ContainerBuilder;
1817
use Symfony\Component\DependencyInjection\Reference;
1918
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
@@ -539,23 +538,28 @@ public function testLoadInlinedServices()
539538
$foo = $container->getDefinition('foo');
540539

541540
$fooFactory = $foo->getFactory();
542-
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $fooFactory[0]);
543-
$this->assertSame('FooFactory', $fooFactory[0]->getClass());
541+
$this->assertInstanceOf(Reference::class, $fooFactory[0]);
542+
$this->assertTrue($container->has((string) $fooFactory[0]));
543+
$fooFactoryDefinition = $container->getDefinition((string) $fooFactory[0]);
544+
$this->assertSame('FooFactory', $fooFactoryDefinition->getClass());
544545
$this->assertSame('createFoo', $fooFactory[1]);
545546

546-
$fooFactoryFactory = $fooFactory[0]->getFactory();
547-
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $fooFactoryFactory[0]);
548-
$this->assertSame('Foobar', $fooFactoryFactory[0]->getClass());
547+
$fooFactoryFactory = $fooFactoryDefinition->getFactory();
548+
$this->assertInstanceOf(Reference::class, $fooFactoryFactory[0]);
549+
$this->assertTrue($container->has((string) $fooFactoryFactory[0]));
550+
$this->assertSame('Foobar', $container->getDefinition((string) $fooFactoryFactory[0])->getClass());
549551
$this->assertSame('createFooFactory', $fooFactoryFactory[1]);
550552

551553
$fooConfigurator = $foo->getConfigurator();
552-
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $fooConfigurator[0]);
553-
$this->assertSame('Bar', $fooConfigurator[0]->getClass());
554+
$this->assertInstanceOf(Reference::class, $fooConfigurator[0]);
555+
$this->assertTrue($container->has((string) $fooConfigurator[0]));
556+
$fooConfiguratorDefinition = $container->getDefinition((string) $fooConfigurator[0]);
557+
$this->assertSame('Bar', $fooConfiguratorDefinition->getClass());
554558
$this->assertSame('configureFoo', $fooConfigurator[1]);
555559

556-
$barConfigurator = $fooConfigurator[0]->getConfigurator();
557-
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $barConfigurator[0]);
558-
$this->assertSame('Baz', $barConfigurator[0]->getClass());
560+
$barConfigurator = $fooConfiguratorDefinition->getConfigurator();
561+
$this->assertInstanceOf(Reference::class, $barConfigurator[0]);
562+
$this->assertSame('Baz', $container->getDefinition((string) $barConfigurator[0])->getClass());
559563
$this->assertSame('configureBar', $barConfigurator[1]);
560564
}
561565

0 commit comments

Comments
 (0)
0