правильное использование контейнера зависимостей

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
grischuk2703
Сообщения: 29
Зарегистрирован: 2013.08.24, 00:59
Откуда: Украина

правильное использование контейнера зависимостей

Сообщение grischuk2703 »

Подскажите как лучше использовать контейнер зависимостей Yii2 чтобы потом можно было сервисы которые регистрируются в контейнере легко перекинуть на любой другой фреймворк. Тоесть как при командной разработке избежать использования глобального Yii::$app внутри сервиса? или тех же моделей? или еще чего то что связано с фреймворком? Возможно есть какие то best practice именно для Yii2?
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: правильное использование контейнера зависимостей

Сообщение skynin »

-- легко перекинуть на любой другой фреймворк
то есть сервисы полностью независимы от любого фреймворка?

-- Тоесть как при командной разработке избежать использования глобального Yii::$app
но ссылаются друг на друга?

-- или тех же моделей?
модели у фреймворков точно разные.

-- или еще чего то что связано с фреймворком?
все что связано с фреймворком - завязано на фреймворк.

-- Возможно есть какие то best practice именно для Yii2?
практики те же что и для других фреймворков:
если требуется сервис независимый от фреймворка, то он пишется независимо от фреймворка
если сервисы зависимы друг от друга, то им нужно пробросавывать ссылку на DI контейнер фреймворка
а так как DI контейнеры у фреймворков разные, то свою обвязку для DI, реализацию которой нужно будет реализовать для каждого конкретного фреймворка

на а дальше, на примере Yii2, настроить под каждый фреймворк:

config/main.php

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

$di = require(__DIR__ . '/di.php');
config/di.php

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

return [
    'definitions' => [
        \zhuravljov\yii\queue\monitor\controllers\JobController::class => [
            'layout' => '@backend/vndrs/yii2-queue-monitor/layouts/main'
        ],
        \zhuravljov\yii\queue\monitor\controllers\WorkerController::class => [
            'layout' => '@backend/vndrs/yii2-queue-monitor/layouts/main'
        ],
        \yii\widgets\LinkPager::class => \backend\components\LinkPager::class,
....
Или для таких межфреймворковых сервисов ипользовать какой-нить pimple.symfony.com/

но думаю вы странного хотите
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: правильное использование контейнера зависимостей

Сообщение ElisDN »

grischuk2703 писал(а): 2020.07.25, 00:34 Подскажите как лучше использовать контейнер зависимостей Yii2 чтобы потом можно было сервисы которые регистрируются в контейнере легко перекинуть на любой другой фреймворк. То есть как при командной разработке избежать использования глобального Yii::$app внутри сервиса?
Не наследовать свои сервисы от классов фреймворка. Разделять уровни ответственности как в этом докладе. Многие фреймворкозависимые сервисы обернуть своими адаптерами. Запретить Yii::$app и все зависимости принимать в конструктор. Например, как здесь или здесь. И сервисы регистрировать в контейнере через 'container' в конфиге или один или несколько bootstrap-классов как этот.
grischuk2703 писал(а): 2020.07.25, 00:34 Или тех же моделей? или еще чего то что связано с фреймворком? Возможно есть какие то best practice именно для Yii2?
Написание фреймворкозависимого кода как раз общее для всех, а не специфичное для Yii2.

Но Yii2 здесь будет часто мешать, так как это фреймворк монолитный, а не компонентный. Из него нельзя вынести с собой любую его часть вроде ActiveRecord и он следует не всем PSR-ам. В нём нельзя без своих адаптеров использовать не наследующиеся от фреймворковского класса контроллеры. Некоторые рекомендации для Yii можно подсмотреть здесь.

Поэтому вместо готового фреймворка оптимальнее будет собирать проект изначально самому из отдельных независимых компонентов. Например, начать с универсального микрофреймворка вроде Slim или Mezzio с фреймворконезависимыми PSR-7 объектами запроса и PSR-15 контроллерами и через Composer самостоятельно подключить нужные компоненты. Например, как сделано в этих скринкастах.

Тогда код будет независимый от любого фреймворка изначально, но придётся это всё в нём делать самому.
grischuk2703
Сообщения: 29
Зарегистрирован: 2013.08.24, 00:59
Откуда: Украина

Re: правильное использование контейнера зависимостей

Сообщение grischuk2703 »

ElisDN писал(а): 2020.07.27, 11:48
grischuk2703 писал(а): 2020.07.25, 00:34 Подскажите как лучше использовать контейнер зависимостей Yii2 чтобы потом можно было сервисы которые регистрируются в контейнере легко перекинуть на любой другой фреймворк. То есть как при командной разработке избежать использования глобального Yii::$app внутри сервиса?
Не наследовать свои сервисы от классов фреймворка. Разделять уровни ответственности как в этом докладе. Многие фреймворкозависимые сервисы обернуть своими адаптерами. Запретить Yii::$app и все зависимости принимать в конструктор. Например, как здесь или здесь. И сервисы регистрировать в контейнере через 'container' в конфиге или один или несколько bootstrap-классов как этот.
grischuk2703 писал(а): 2020.07.25, 00:34 Или тех же моделей? или еще чего то что связано с фреймворком? Возможно есть какие то best practice именно для Yii2?
Написание фреймворкозависимого кода как раз общее для всех, а не специфичное для Yii2.

Но Yii2 здесь будет часто мешать, так как это фреймворк монолитный, а не компонентный. Из него нельзя вынести с собой любую его часть вроде ActiveRecord и он следует не всем PSR-ам. В нём нельзя без своих адаптеров использовать не наследующиеся от фреймворковского класса контроллеры. Некоторые рекомендации для Yii можно подсмотреть здесь.

Поэтому вместо готового фреймворка оптимальнее будет собирать проект изначально самому из отдельных независимых компонентов. Например, начать с универсального микрофреймворка вроде Slim или Mezzio с фреймворконезависимыми PSR-7 объектами запроса и PSR-15 контроллерами и через Composer самостоятельно подключить нужные компоненты. Например, как сделано в этих скринкастах.

Тогда код будет независимый от любого фреймворка изначально, но придётся это всё в нём делать самому.
Спасибо большое за такой развернутый ответ, буду разбираться, если что еще задам вопросы в этой теме
Ответить