Size: a a a

2020 March 19

DS

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

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

Мой вариант отлично подходит для пакетов, которые предназначены для Yii и уже зависят от yii-web. В случае с фреймворко-независимыми пакетами у которых есть какая-то форма ресета, нужно будет ресетить руками. Если ресета нет, то тут только unset() кеша инстанса в контейнере.
В пакете yiisoft/resetable единственный интерфейс Resetable. Ты серьезно считаешь, что это стравнимо с зависимостью от yiisoft/yii-web и yiisoft/ebent-dispatcher? И твой вариант подходит только для спец пакетов только для и ты правда считаетшь это нормальным?
источник

DS

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

AM

Alexander Makarov in Yii Framework 3
Проблема не в том, что resetable - зависимость. Проблема в том, что в сторонних пакетах он имплементирован не будет.
источник

AM

Alexander Makarov in Yii Framework 3
В пакетах yiisoft, которые general purpose тоже не будет.
источник

AM

Alexander Makarov in Yii Framework 3
Остаются только yii-* пакеты.
источник

AM

Alexander Makarov in Yii Framework 3
А они могут цепляться к событиям.
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
Проблема не в том, что resetable - зависимость. Проблема в том, что в сторонних пакетах он имплементирован не будет.
В стороннем пакете который я напишу - будет. И я хочу этот пакет юзать не только в yii3, а и вдругих фреймворках, но хочу чтобы он работал из коробки с рр.
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
В пакетах yiisoft, которые general purpose тоже не будет.
Схерали их там не может быть?
источник

AM

Alexander Makarov in Yii Framework 3
Для этого пакета нужен будет yiisoft/di?
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
Для этого пакета нужен будет yiisoft/di?
Нет
источник

AM

Alexander Makarov in Yii Framework 3
Dmitriy S
Схерали их там не может быть?
Пример приведи из текущей сотни пакетов.
источник

AM

Alexander Makarov in Yii Framework 3
Dmitriy S
Нет
И кто будет вызывать reset()?
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
И кто будет вызывать reset()?
Я тебе описал варинат с коллекцией. Все зависит от контекста, например можно отнаследовать используемый контейнер и добавить туда сброс вместо пересоздания.
источник

Д

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

А

Алексей R in Yii Framework 3
Если выносить Resetable в пакет, то надо будет его переименовывать (и метод тоже) в какойнить ResetableServiceInterface и resetService()
Но меня больше коробит то, что он слишком маленький, узкоспециализированный и вряд ли кем-то в перспективе реализуемый
источник

Д

Дмитрий in Yii Framework 3
@yiiliveext никто в здравом уме не будет монтировать себе ресет интерфейс, а кому нужно, тот сделает свой. Фреймворк дальше определенного уровня с точки зрения архитектуры никуда не будет лезть, значит и используется будет в ограниченных местах. Интерфейс ничего не решает, а даже наоборот, ломает циклы работы приложения (пхп приложения)
источник

Д

Дмитрий in Yii Framework 3
А почему от ресетбл контейнера отказались?
источник

AM

Alexander Makarov in Yii Framework 3
не отказались
источник

AM

Alexander Makarov in Yii Framework 3
он всё ещё есть в pull request
источник

А

Алексей R in Yii Framework 3
Дмитрий
А почему от ресетбл контейнера отказались?
не отказались. Дмитрий топит за то, что некоторые сервисы надо ресетить а не пересоздавать
источник