[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) { if ($value instanceof TypedReference && $value->getType() === (string) $value) {
// Already checked // Already checked
$bindings = $this->container->getDefinition($this->currentId)->getBindings(); $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()])) { if (isset($bindings[$value->getType()])) {
return $this->getBindingValue($bindings[$value->getType()]); return $this->getBindingValue($bindings[$value->getType()]);

View File

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