Давай возьмем некую реальную ситуацию. Допустим я написал некоторый пакет, который не зависит от какого-либо фреймворка. И в нем есть некие стейтфул сервисы, которые должны быть сброшены, если будут использоваться с такими штуками как рр. То есть, я хочу чтобы мой пакет из коробки работал в yii3 в режиме работы через рр. Теперь давай сравним две реализации, мою с рисетейбл интерфейсом в отдельном пакете и твою с самосбросом стейтфул сервиса по событию через ивент диспетчер.
1. Мой вариант.
Я добавляю в зависимости пакет yiisoft/resetable
и просто имплементирую в соответсвующих сервисах интерфейс Resetable
. Сброс состояния этих сервисов - это задача приложения и опциональная операция. Скажем, если этот пакет будет использоваться в консольном приложении, то никаких лишних действий произведено не будет. Теперь представь, что этот же пакет я использую например в симфони. Все что мне лишнего прилетит - это интерфейс Resetable
, а сами сервисы будут использоваться как обычно, без каких-либо лишних действий. Но если я захочу в каком-то другом фреймворке организовать работу через рр, то у моих сервисов уже будет готовый интерфейс для сброса их состояния, дело только за реализацией сброса таких сервисов нативными методами фреймворка.
2. Твой вариант.
Я добавляю зависимостями пакеты yiisoft/event-dispatcher`и `yiisoft/yii-web
. Уже смешно, да? Мы же делали фреймворко независимый пакет, да? Ну ок, поехали дальше. Если я добавлю этот пакет в приложение на yii3, которое работает на рр, то все будет ок. А если на обычное? Правильно, все мои сервисы все равно будут добавлять в диспетчер обработчик и в конце запроса сбрасывать состояние, хотя это там нафиг не нужно. А что будет если я добавлю этот пакет в чисто консольное приложение? Правильно, туда затянет ненужный там пакет yii-web, и будет вхолостую юзать ивент диспетчер, добавив лишнюю подписку. А теперь давай представим, что этот пакет я подключил к симфони. Мне туда затянет yiisoft/event-dispatcher`и `yiisoft/yii-web
, и нафиг они мне там нужны? А нафига мне нужно создавать и пердавать в конструктор неиспользуемый ивент диспетчер? Ну тут еще ок, есть выход, я могу ему поставить дефолтный null
, но не все контейнеры работают так, как yiisoft/di
и не факт, что при автоваеринге какой-то контейнер все же не захочет инстанцировать ивент диспетчер. А что делать, если я в каком-то другом фреймворке захочу организовать работу с рр? Вместе с нативной системой событий юзать йишный ивент диспетчер и эмулировать в нативных событиях йишные события? Ну так это жуткий костыль.
В общем то, в чем ты обывинял мою реализацию как раз является недостатком твоей. Именно в твоей реализации жестко диктуется способ имплементации стейтфул сервисов, причем еще и фреймворко-зависимый способ имплементации. И то, что ты говорил о том, что якобы моя реализация привязывает сервисы к пакету/контейнер yiisoft/di
- этот тоже ерунда. Я даже не буду говорить о том, что в случае приложения, работающего через рр, будут в 99.9% случаев использованы контейнеры из пакета yiisoft/di
. Возьмем этот 0.1%, никто не мешает сделать для таких сервисов отдельную коллекцию и хранить ее в контейнере, а в конце каждого запроса доставать ее из контейнера и проходясь по ней, вызывать у каждого объекта метод reset()
. И все, нет никаких проблем и никакой зависимости от yiisoft/di
.
@nex_otaku а ну, расскажи ему за зависимости)