[DI] fix resolving bindings for named TypedReference

This commit is contained in:
Nicolas Grekas 2019-12-03 10:36:50 +01:00
parent e9366b4d17
commit 62c227e368
2 changed files with 14 additions and 1 deletions

View File

@ -95,6 +95,11 @@ class ResolveBindingsPass extends AbstractRecursivePass
if ($value instanceof TypedReference && $value->getType() === (string) $value) {
// Already checked
$bindings = $this->container->getDefinition($this->currentId)->getBindings();
$name = $value->getName();
if (isset($name, $bindings[$name = $value.' $'.$name])) {
return $this->getBindingValue($bindings[$name]);
}
if (isset($bindings[$value->getType()])) {
return $this->getBindingValue($bindings[$value->getType()]);

View File

@ -80,7 +80,10 @@ class ResolveBindingsPassTest extends TestCase
{
$container = new ContainerBuilder();
$bindings = [CaseSensitiveClass::class => new BoundArgument(new Reference('foo'))];
$bindings = [
CaseSensitiveClass::class => new BoundArgument(new Reference('foo')),
CaseSensitiveClass::class.' $c' => new BoundArgument(new Reference('bar')),
];
// Explicit service id
$definition1 = $container->register('def1', NamedArgumentsDummy::class);
@ -91,11 +94,16 @@ class ResolveBindingsPassTest extends TestCase
$definition2->addArgument(new TypedReference(CaseSensitiveClass::class, CaseSensitiveClass::class));
$definition2->setBindings($bindings);
$definition3 = $container->register('def3', NamedArgumentsDummy::class);
$definition3->addArgument(new TypedReference(CaseSensitiveClass::class, CaseSensitiveClass::class, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, 'c'));
$definition3->setBindings($bindings);
$pass = new ResolveBindingsPass();
$pass->process($container);
$this->assertEquals([$typedRef], $container->getDefinition('def1')->getArguments());
$this->assertEquals([new Reference('foo')], $container->getDefinition('def2')->getArguments());
$this->assertEquals([new Reference('bar')], $container->getDefinition('def3')->getArguments());
}
public function testScalarSetter()