Простой блог быдлокодера

4.12K
.
The Fast, Secure and Professional - Yii2
# 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, Где? В контейнере? Ну не знаю. Всё как обычно, автоматический резолвинг, аннотации, определения. Больше вроде как ничего и нет.
.
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. Этот менеджер как раз и рулит кэшэм.
Ну а затем всё это добро инжектится в контейнер. Я ещё пропустил прокси менеджер, который позволяет организовать ленивую инициализацию при первом обращении к атрибуту/методу класса, если не ошибаюсь. Я не стал дальше разбираться.
Всего: 215