правильное использование контейнера зависимостей
-
- Сообщения: 29
- Зарегистрирован: 2013.08.24, 00:59
- Откуда: Украина
правильное использование контейнера зависимостей
Подскажите как лучше использовать контейнер зависимостей Yii2 чтобы потом можно было сервисы которые регистрируются в контейнере легко перекинуть на любой другой фреймворк. Тоесть как при командной разработке избежать использования глобального Yii::$app внутри сервиса? или тех же моделей? или еще чего то что связано с фреймворком? Возможно есть какие то best practice именно для Yii2?
Re: правильное использование контейнера зависимостей
-- легко перекинуть на любой другой фреймворк
то есть сервисы полностью независимы от любого фреймворка?
-- Тоесть как при командной разработке избежать использования глобального Yii::$app
но ссылаются друг на друга?
-- или тех же моделей?
модели у фреймворков точно разные.
-- или еще чего то что связано с фреймворком?
все что связано с фреймворком - завязано на фреймворк.
-- Возможно есть какие то best practice именно для Yii2?
практики те же что и для других фреймворков:
если требуется сервис независимый от фреймворка, то он пишется независимо от фреймворка
если сервисы зависимы друг от друга, то им нужно пробросавывать ссылку на DI контейнер фреймворка
а так как DI контейнеры у фреймворков разные, то свою обвязку для DI, реализацию которой нужно будет реализовать для каждого конкретного фреймворка
на а дальше, на примере Yii2, настроить под каждый фреймворк:
config/main.php
config/di.php
Или для таких межфреймворковых сервисов ипользовать какой-нить pimple.symfony.com/
но думаю вы странного хотите
то есть сервисы полностью независимы от любого фреймворка?
-- Тоесть как при командной разработке избежать использования глобального Yii::$app
но ссылаются друг на друга?
-- или тех же моделей?
модели у фреймворков точно разные.
-- или еще чего то что связано с фреймворком?
все что связано с фреймворком - завязано на фреймворк.
-- Возможно есть какие то best practice именно для Yii2?
практики те же что и для других фреймворков:
если требуется сервис независимый от фреймворка, то он пишется независимо от фреймворка
если сервисы зависимы друг от друга, то им нужно пробросавывать ссылку на DI контейнер фреймворка
а так как DI контейнеры у фреймворков разные, то свою обвязку для DI, реализацию которой нужно будет реализовать для каждого конкретного фреймворка
на а дальше, на примере Yii2, настроить под каждый фреймворк:
config/main.php
Код: Выделить всё
$di = require(__DIR__ . '/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,
....
но думаю вы странного хотите
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: правильное использование контейнера зависимостей
Не наследовать свои сервисы от классов фреймворка. Разделять уровни ответственности как в этом докладе. Многие фреймворкозависимые сервисы обернуть своими адаптерами. Запретить Yii::$app и все зависимости принимать в конструктор. Например, как здесь или здесь. И сервисы регистрировать в контейнере через 'container' в конфиге или один или несколько bootstrap-классов как этот.grischuk2703 писал(а): ↑2020.07.25, 00:34 Подскажите как лучше использовать контейнер зависимостей Yii2 чтобы потом можно было сервисы которые регистрируются в контейнере легко перекинуть на любой другой фреймворк. То есть как при командной разработке избежать использования глобального Yii::$app внутри сервиса?
Написание фреймворкозависимого кода как раз общее для всех, а не специфичное для Yii2.grischuk2703 писал(а): ↑2020.07.25, 00:34 Или тех же моделей? или еще чего то что связано с фреймворком? Возможно есть какие то best practice именно для Yii2?
Но Yii2 здесь будет часто мешать, так как это фреймворк монолитный, а не компонентный. Из него нельзя вынести с собой любую его часть вроде ActiveRecord и он следует не всем PSR-ам. В нём нельзя без своих адаптеров использовать не наследующиеся от фреймворковского класса контроллеры. Некоторые рекомендации для Yii можно подсмотреть здесь.
Поэтому вместо готового фреймворка оптимальнее будет собирать проект изначально самому из отдельных независимых компонентов. Например, начать с универсального микрофреймворка вроде Slim или Mezzio с фреймворконезависимыми PSR-7 объектами запроса и PSR-15 контроллерами и через Composer самостоятельно подключить нужные компоненты. Например, как сделано в этих скринкастах.
Тогда код будет независимый от любого фреймворка изначально, но придётся это всё в нём делать самому.
-
- Сообщения: 29
- Зарегистрирован: 2013.08.24, 00:59
- Откуда: Украина
Re: правильное использование контейнера зависимостей
Спасибо большое за такой развернутый ответ, буду разбираться, если что еще задам вопросы в этой темеElisDN писал(а): ↑2020.07.27, 11:48Не наследовать свои сервисы от классов фреймворка. Разделять уровни ответственности как в этом докладе. Многие фреймворкозависимые сервисы обернуть своими адаптерами. Запретить Yii::$app и все зависимости принимать в конструктор. Например, как здесь или здесь. И сервисы регистрировать в контейнере через 'container' в конфиге или один или несколько bootstrap-классов как этот.grischuk2703 писал(а): ↑2020.07.25, 00:34 Подскажите как лучше использовать контейнер зависимостей Yii2 чтобы потом можно было сервисы которые регистрируются в контейнере легко перекинуть на любой другой фреймворк. То есть как при командной разработке избежать использования глобального Yii::$app внутри сервиса?
Написание фреймворкозависимого кода как раз общее для всех, а не специфичное для Yii2.grischuk2703 писал(а): ↑2020.07.25, 00:34 Или тех же моделей? или еще чего то что связано с фреймворком? Возможно есть какие то best practice именно для Yii2?
Но Yii2 здесь будет часто мешать, так как это фреймворк монолитный, а не компонентный. Из него нельзя вынести с собой любую его часть вроде ActiveRecord и он следует не всем PSR-ам. В нём нельзя без своих адаптеров использовать не наследующиеся от фреймворковского класса контроллеры. Некоторые рекомендации для Yii можно подсмотреть здесь.
Поэтому вместо готового фреймворка оптимальнее будет собирать проект изначально самому из отдельных независимых компонентов. Например, начать с универсального микрофреймворка вроде Slim или Mezzio с фреймворконезависимыми PSR-7 объектами запроса и PSR-15 контроллерами и через Composer самостоятельно подключить нужные компоненты. Например, как сделано в этих скринкастах.
Тогда код будет независимый от любого фреймворка изначально, но придётся это всё в нём делать самому.