Просмотр поста

.
reaper

Рано радовался Гг. Напоролся не то ли на баг, не то ли на фичу. Короче если определено более одного источника определений, то контейнер не может найти какое-либо конкретное определение:

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);


Покопал немного исходники и похоже выяснил, кто виноват, а вот что делать пока не знаю. Создал тикет, пусть автор помогает