From f86ad956839a2bee31678442e1d4d9d2ff0c744d Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sun, 25 Jan 2015 08:08:53 +0100 Subject: [PATCH] [DependencyInjection] fixed service resolution for factories --- .../ResolveParameterPlaceHoldersPass.php | 1 + .../DependencyInjection/Dumper/PhpDumper.php | 4 +++- .../Tests/ContainerBuilderTest.php | 20 ++++++++++++++----- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php index 6fc0a873a6..e7c7caf17c 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php @@ -37,6 +37,7 @@ class ResolveParameterPlaceHoldersPass implements CompilerPassInterface $definition->setClass($parameterBag->resolveValue($definition->getClass())); $definition->setFile($parameterBag->resolveValue($definition->getFile())); $definition->setArguments($parameterBag->resolveValue($definition->getArguments())); + $definition->setFactoryClass($parameterBag->resolveValue($definition->getFactoryClass())); $calls = array(); foreach ($definition->getMethodCalls() as $name => $arguments) { diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index c12a60d2b9..0b0c2dc2e7 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -1223,7 +1223,9 @@ EOF; if (null !== $value->getFactoryClass()) { return sprintf("call_user_func(array(%s, '%s')%s)", $this->dumpValue($value->getFactoryClass()), $value->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : ''); } elseif (null !== $value->getFactoryService()) { - return sprintf("%s->%s(%s)", $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments)); + $service = $this->dumpValue($definition->getFactoryService()); + + return sprintf("%s->%s(%s)", 0 === strpos($service, '$') ? sprintf('$this->get(%s)', $service) : $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments)); } else { throw new RuntimeException('Cannot dump definitions which have factory method without factory service or factory class.'); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php index da37230489..22f4b5bd32 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php @@ -322,8 +322,14 @@ class ContainerBuilderTest extends \PHPUnit_Framework_TestCase { $builder = new ContainerBuilder(); $builder->register('bar', 'stdClass'); - $builder->register('foo1', 'FooClass')->setFactoryClass('FooClass')->setFactoryMethod('getInstance')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar'))); + $builder + ->register('foo1', 'FooClass') + ->setFactoryClass('%foo_class%') + ->setFactoryMethod('getInstance') + ->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar'))) + ; $builder->setParameter('value', 'bar'); + $builder->setParameter('foo_class', 'FooClass'); $this->assertTrue($builder->get('foo1')->called, '->createService() calls the factory method to create the service instance'); $this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar')), $builder->get('foo1')->arguments, '->createService() passes the arguments to the factory method'); } @@ -334,10 +340,14 @@ class ContainerBuilderTest extends \PHPUnit_Framework_TestCase public function testCreateServiceFactoryService() { $builder = new ContainerBuilder(); - $builder->register('baz_service')->setFactoryService('baz_factory')->setFactoryMethod('getInstance'); - $builder->register('baz_factory', 'BazClass'); - - $this->assertInstanceOf('BazClass', $builder->get('baz_service')); + $builder->register('foo_service', 'FooClass'); + $builder + ->register('foo', 'FooClass') + ->setFactoryService('%foo_service%') + ->setFactoryMethod('getInstance') + ; + $builder->setParameter('foo_service', 'foo_service'); + $this->assertTrue($builder->get('foo')->called, '->createService() calls the factory method to create the service instance'); } /**