Size: a a a

2020 March 19

DS

Dmitriy S in Yii Framework 3
Ну... можно и так. А если кто-то захочет сделать свой реситейбл контейнер?
источник

AM

Alexander Makarov in Yii Framework 3
создаст issue
источник

AM

Alexander Makarov in Yii Framework 3
вернём интерфейс
источник

AM

Alexander Makarov in Yii Framework 3
а, не
источник

AM

Alexander Makarov in Yii Framework 3
нельзя интерфейс убивать
источник

DS

Dmitriy S in Yii Framework 3
Пока не удаляю. Завтра попробую сначала через событие рисетить, если все ок будет, то уберу потом. По остальному возражений нет?
источник

AM

Alexander Makarov in Yii Framework 3
иначе наследование CompositeContainer не получится с ресетом
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
нельзя интерфейс убивать
Ну да, там же еще композитный контейнер тоже рисетейбл
источник

AM

Alexander Makarov in Yii Framework 3
в ResetableContainerInterface тогда переименовать надо
источник

DS

Dmitriy S in Yii Framework 3
Оно по всей иерархии сейчас рисетит
источник

AM

Alexander Makarov in Yii Framework 3
чтобы показать что это для контейнера, а не для зависимости
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
чтобы показать что это для контейнера, а не для зависимости
Ок, делай
источник

DS

Dmitriy S in Yii Framework 3
А я уже спать пойду)
источник

AM

Alexander Makarov in Yii Framework 3
Спокойной.
источник

DS

Dmitriy S in Yii Framework 3
В общем зря я тебя послушал вчера, твой варинант с рисетом по событию - это полная лажа.
источник

AM

Alexander Makarov in Yii Framework 3
Dmitriy S
В общем зря я тебя послушал вчера, твой варинант с рисетом по событию - это полная лажа.
Почему?
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
Почему?
Напишу попозже, там много текста надо
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
Почему?
Давай возьмем некую реальную ситуацию. Допустим я написал некоторый пакет, который не зависит от какого-либо фреймворка. И в нем есть некие стейтфул сервисы, которые должны быть сброшены, если будут использоваться с такими штуками как рр. То есть, я хочу чтобы мой пакет из коробки работал в 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.
источник

AM

Alexander Makarov in Yii Framework 3
> Давай возьмем некую реальную ситуацию. Допустим я написал некоторый пакет, который не зависит от какого-либо фреймворка. И в нем есть некие стейтфул сервисы, которые должны быть
сброшены, если будут использоваться с такими штуками как рр.

А "который не зависит от какого-либо фреймворка" включает в себя независимость от Resetable? Большинство сторонних сервисов с состоянием гарантировано не будут его имплементировать.

Мой вариант отлично подходит для пакетов, которые предназначены для Yii и уже зависят от yii-web. В случае с фреймворко-независимыми пакетами у которых есть какая-то форма ресета, нужно будет ресетить руками. Если ресета нет, то тут только unset() кеша инстанса в контейнере.
источник

AM

Alexander Makarov in Yii Framework 3
Твой Resetable, по факту, использоваться будет только в пакетах yii-что-то. А их и так реюзать вне фреймворка нельзя.
источник