Рано радовался Гг. Напоролся не то ли на баг, не то ли на фичу. Короче если определено более одного источника определений, то контейнер не может найти какое-либо конкретное определение:
use DI\Container;
use DI\ContainerBuilder;
use DI\Definition\Source\ArrayDefinitionSource;
class A {
public function getData()
{
return 'data';
}
}
class B {
private $data;
public function __construct($data)
{
$this->data = $data;
}
}
class C {
private $a;
public function __construct(A $a)
{
$this->a = $a;
}
}
class D {
private $a;
private $b;
private $params;
public function __construct(A $a, B $b, $params)
{
$this->a = $a;
$this->b = $b;
$this->params = $params;
}
}
$definitions1 = [
];
$definitions2 = [
A::class => \DI\object(),
B::class => \DI\factory(function (Container $c) {
return new B($c->get(A::class)->getData());
}),
C::class => \DI\object()->constructor(\DI\link(A::class)),
D::class => \DI\factory(function (Container $c) {
return new D($c->get(A::class), $c->get(B::class), 'params');
}),
];
$builder = new ContainerBuilder();
$builder->useAutowiring(false);
$builder->useAnnotations(false);
$builder->addDefinitions(new ArrayDefinitionSource($definitions1));
$builder->addDefinitions(new ArrayDefinitionSource($definitions2));
$container = $builder->build();
$c = $container->get(C::class);
$d = $container->get(D::class);
var_dump($c, $d);Покопал немного исходники и похоже выяснил, кто виноват, а вот что делать пока не знаю. Создал тикет, пусть автор помогает