Yii DI - фреймворконезависимый контейнер и инжектор

Выкладываем свои наработки
zelenin
Сообщения: 10248
Зарегистрирован: 2013.04.20, 11:30

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение zelenin » 2017.11.26, 17:59

samdark писал(а):
2017.11.26, 16:51
"ну давай, расскажи мне про рефакторинг". Мы же про контейнер или про рефакторинг?
Одно влияет на другое.
проблемы рефакторинга решаются другими способами, а не подстраиванием библиотеки под неотносящююся к ней проблему.
Если мы про rename строковых id, то, ты знаешь, это решается константами, а не di-контейнером.

Аватара пользователя
ElisDN
Сообщения: 4724
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение ElisDN » 2017.11.26, 19:11

samdark писал(а):
2017.11.26, 16:49
В примере по ссылке на тему конфига не ясно, почему конфиг должен быть именно в DI-контейнере.
Одного контейнера уже достаточно для построения системы конфигурации всего приложения, если ему всё равно, что во что иньектить: объекты, строки, массивы:

Код: Выделить всё

$container->set(Mailer::class, function () { // задаём объект
    return new Mailer( ... );
});

$container->set('supportEmail', 'mail@site.com'); // задаём параметр

$container->set(UserNotifier::class, function (Container $container) {
    return new UserNotifier(
        $container->get(Mailer::class), // иньектим объект
        $container->get('supportEmail'), // иньектим параметр
    );
});

...

$application = $container->get(Application::class);

$request = ServerRequestFactory::gromGlobals();
$application->handle($request);
Всё конфигурирование централизовано и не нужно возиться с отдельными $params['supportEmail'].
Не забудьте пройти мастер-класс по Yii2.

Аватара пользователя
samdark
Администратор
Сообщения: 8653
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение samdark » 2017.11.26, 21:52

Про зависимости от значений логично. Спасибо.

Пробую перестроить на анонимки всё. Вроде нормально. Чуть дорихтую — закину в отдельную ветку.

Аватара пользователя
samdark
Администратор
Сообщения: 8653
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение samdark » 2017.11.26, 22:05

https://github.com/yiisoft/di/pull/3 — так интересней? Гибче стало, проще... не факт.

zelenin
Сообщения: 10248
Зарегистрирован: 2013.04.20, 11:30

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение zelenin » 2017.11.26, 22:18

у меня нет сил или такого острого глаза как у ElisDN, чтобы быстро разобрать весь код. Но используя такую реализацию в проде https://pastebin.com/MUQVJCm2 я недоумеваю, почему все так сложно.

zelenin
Сообщения: 10248
Зарегистрирован: 2013.04.20, 11:30

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение zelenin » 2017.11.26, 22:26

что это?
https://github.com/yiisoft/di/blob/0fe7 ... er.php#L20
https://github.com/yiisoft/di/blob/0fe7 ... er.php#L37
https://github.com/yiisoft/di/blob/0fe7 ... er.php#L45
https://github.com/yiisoft/di/blob/0fe7 ... er.php#L52
https://github.com/yiisoft/di/blob/0fe7 ... er.php#L62
https://github.com/yiisoft/di/blob/0fe7 ... on.php#L54

предположу, что это сделано, чтобы добавить немного "как в yii" и засыпаться сахаром, чтобы фабрики/анонимки не делать, придумав свой формат определения сервисов.

Аватара пользователя
samdark
Администратор
Сообщения: 8653
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение samdark » 2017.11.27, 08:52

ArrayContainerBuilder — это чтобы декларативные конфиги превращать в анонимки. Сам контейнер получился не сложнее, чем у тебя, но описывать в таком стиле всё довольно муторно, хоть и гибко, и это всё-таки код, а не конфиг.

Аватара пользователя
ElisDN
Сообщения: 4724
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение ElisDN » 2017.11.27, 09:01

zelenin писал(а):
2017.11.26, 22:26
что это?
Попытка сделать декларативный конфиг как в Symfony и Phalcon. Как полтора года назад я примеры синтаксиса приводил, но с попыткой вывернуть декларации в приоритет публичных полей.
Не забудьте пройти мастер-класс по Yii2.

Аватара пользователя
ElisDN
Сообщения: 4724
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение ElisDN » 2017.11.27, 09:13

samdark писал(а):
2017.11.27, 08:52
ArrayContainerBuilder — это чтобы декларативные конфиги превращать в анонимки.
Тогда можно:

Код: Выделить всё

$container = (new ArrayContainerBuilder($definitions))->build();
заменить на:

Код: Выделить всё

$container = new Container();
(new ArrayContainerBuilder())->build($container, $definitions);
чтобы не нужны были parent/child.
Не забудьте пройти мастер-класс по Yii2.

Аватара пользователя
samdark
Администратор
Сообщения: 8653
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Yii DI - фреймворконезависимый контейнер и инжектор

Сообщение samdark » 2017.11.27, 23:04

То есть чтобы билдер наполнял, а не создавал? Да, возможно...

Ответить