Skip to content

Commit d2fc77e

Browse files
committed
Merge branch '2.3' into 2.6
* 2.3: [DependencyInjection] fixed service resolution for factories Conflicts: src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php
2 parents cc18a59 + e34387d commit d2fc77e

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public function process(ContainerBuilder $container)
3737
$definition->setClass($parameterBag->resolveValue($definition->getClass()));
3838
$definition->setFile($parameterBag->resolveValue($definition->getFile()));
3939
$definition->setArguments($parameterBag->resolveValue($definition->getArguments()));
40+
$definition->setFactoryClass($parameterBag->resolveValue($definition->getFactoryClass()));
4041

4142
$calls = array();
4243
foreach ($definition->getMethodCalls() as $name => $arguments) {

src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1332,7 +1332,9 @@ private function dumpValue($value, $interpolate = true)
13321332
if (null !== $value->getFactoryClass()) {
13331333
return sprintf("call_user_func(array(%s, '%s')%s)", $this->dumpValue($value->getFactoryClass()), $value->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
13341334
} elseif (null !== $value->getFactoryService()) {
1335-
return sprintf("%s->%s(%s)", $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments));
1335+
$service = $this->dumpValue($definition->getFactoryService());
1336+
1337+
return sprintf("%s->%s(%s)", 0 === strpos($service, '$') ? sprintf('$this->get(%s)', $service) : $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments));
13361338
} else {
13371339
throw new RuntimeException('Cannot dump definitions which have factory method without factory service or factory class.');
13381340
}

src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,33 @@ public function testCreateServiceFactory()
331331
$this->assertTrue($builder->get('qux')->called, '->createService() calls the factory method to create the service instance');
332332
$this->assertTrue($builder->get('bar')->called, '->createService() uses anonymous service as factory');
333333
$this->assertTrue($builder->get('baz')->called, '->createService() uses another service as factory');
334+
335+
$builder
336+
->register('foo1', 'Bar\FooClass')
337+
->setFactoryClass('%foo_class%')
338+
->setFactoryMethod('getInstance')
339+
->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')))
340+
;
341+
$builder->setParameter('value', 'bar');
342+
$builder->setParameter('foo_class', 'Bar\FooClass');
343+
$this->assertTrue($builder->get('foo1')->called, '->createService() calls the factory method to create the service instance');
344+
$this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar')), $builder->get('foo1')->arguments, '->createService() passes the arguments to the factory method');
345+
}
346+
347+
/**
348+
* @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
349+
*/
350+
public function testCreateServiceFactoryService()
351+
{
352+
$builder = new ContainerBuilder();
353+
$builder->register('foo_service', 'Bar\FooClass');
354+
$builder
355+
->register('foo', 'Bar\FooClass')
356+
->setFactoryService('%foo_service%')
357+
->setFactoryMethod('getInstance')
358+
;
359+
$builder->setParameter('foo_service', 'foo_service');
360+
$this->assertTrue($builder->get('foo')->called, '->createService() calls the factory method to create the service instance');
334361
}
335362

336363
/**

0 commit comments

Comments
 (0)