# reaper (23.03.2015 / 00:58)
И роутинги ведь тоже надо настраивать, не так-ли?
Нет, роутинг настраиваем если нужно изменить какой-то путь к примеру есть у нас controller/action?id=2 а нам нужно сделать controller/action/2
В конце-концов не забывай, что это своего рода micro-framework.
Всё, теперь понятно почему этого нету сразу
reaper,
'container' => [
'definitions' => [
'model' => \DI\object(Model::class),
'view' => \DI\object(View::class),
'controller' => \DI\object(Controller::class)
->constructor(
\DI\link('model'),
\DI\link('view')
),
],
],
А что это за контейнер такой?
L!MP, PHP-DI. Вещь -- Круть!
reaper, угу, понял. Как то там оверкил в коде, слишком много всего прикручено.
L!MP, Где? В контейнере? Ну не знаю. Всё как обычно, автоматический резолвинг, аннотации, определения. Больше вроде как ничего и нет.
reaper, а как там забиндить интерфейс к реализации, но так что бы autowiring был (он же, как я понимаю, отключен по-умолчанию)?
Сам прочел.
L!MP, Это у меня он отключён :-)
Биндить вот так:
[
EventDispatcherInterface::class => \DI\object(ContainerAwareEventDispatcher::class)
]
Полистай
доку, она не большая, сразу все вопросы отпадут.
Рано радовался Гг. Напоролся не то ли на баг, не то ли на фичу. Короче если определено более одного источника определений, то контейнер не может найти какое-либо конкретное определение:
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);
Покопал немного исходники и похоже выяснил, кто виноват, а вот что делать пока не знаю. Создал тикет, пусть автор помогает
reaper, офтоп.
$container = $builder->build();
Что тут вот происходит? Он генерирует какой-то статический контейнер и сохраняет на диск или всё в памяти происходит при каждом запросе?
L!MP, Короче там есть такая штука, как источники определений. Их всего несколько видов:
ArrayDefinitionSource, PHPFileDefinitionSource (наследуется от ArrayDefinitionSource), Reflection для авторезолвинга и Annotation для аннотаций.
Ты создаёшь билдер. Можешь добавить туда только ChainableDefinitionSource, т.е. либо массив, либо похапефайл.
Затем все эти сорсы связываются между собой. И первый источник передаётся в definition manager. Этот менеджер как раз и рулит кэшэм.
Ну а затем всё это добро инжектится в контейнер. Я ещё пропустил прокси менеджер, который позволяет организовать ленивую инициализацию при первом обращении к атрибуту/методу класса, если не ошибаюсь. Я не стал дальше разбираться.