yii2-cqrs (имплементация cqrs)
yii2-cqrs (имплементация cqrs)
Базовая имплементация CQRS https://en.wikipedia.org/wiki/Command%E ... separation
Интегрирует пакет https://github.com/zelenin/cqrs в Yii2. Пакет требует 5.5+ (поскольку изначально разрабатывался в контексте Symfony 3), поэтому, боюсь, на 5.4 не поднимется. Для желающих можно будет что-нибудь придумать.
Думаю, полезно будет только при полном следовании DDD. Для обертки над ActiveRecord смысла не имеет, кроме как "пощупать".
Интегрирует пакет https://github.com/zelenin/cqrs в Yii2. Пакет требует 5.5+ (поскольку изначально разрабатывался в контексте Symfony 3), поэтому, боюсь, на 5.4 не поднимется. Для желающих можно будет что-нибудь придумать.
Думаю, полезно будет только при полном следовании DDD. Для обертки над ActiveRecord смысла не имеет, кроме как "пощупать".
Re: yii2-cqrs (имплементация cqrs)
для инкапсуляции подбора хэндлера для команды/запроса. Формально не требуется, но во всех реализациях на всех языках есть.Sam Dark писал(а):А зачем там шина?
Кстати, вот если сравните реализацию с моим же cqrs-bundle для симфони, то увидите, что регистрация хэндлеров сделана на уровне компиляции конфигов с помощью тэгов сервисов. Для yii же мне пришлось придумывать Initializer, что мне не нравится. Отсюда:
1. Как бы вы сделали регистрацию хэндлеров?
Я честно говоря покопался в di/service locator, но вещь в себе конечно. Не разобрался как заюзать di и прикрутить это к service locator. Цель была: задать для интерфейсов базовую реализацию (Yii::$container->set(InterfaceName, ['class'=> className])) с возможностью ее переопределить, и юзать одним инстансом (Yii::$container->get(..) возвращает всегда новый инстанс).
Времени разбираться в каких вариациях это будет работать жалко, учитывая что это не боевое расширение, а скорее proof of concept.
2. Запрос на фичу для yii2 - тегирование компонентов.
Вообще имплементацию сделал for fun, для "посмотреть новичкам". Уверен, что yii2-программисты юзать это не будут.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: yii2-cqrs (имплементация cqrs)
Вообще странно, конечно, это в сервисы тащить. Если бы не шина, не было бы нужды в этом.
По новым инстансам имеется ввиду http://www.yiiframework.com/doc-2.0/yii ... t()-detail?
По новым инстансам имеется ввиду http://www.yiiframework.com/doc-2.0/yii ... t()-detail?
Нравится Yii? Давайте сделаем его лучше!.
Re: yii2-cqrs (имплементация cqrs)
а что такое сервис и что тогда в сервис локейтор пихать?Sam Dark писал(а):Вообще странно, конечно, это в сервисы тащить. Если бы не шина, не было бы нужды в этом.
Сервис - любой класс, имеющий некую служебную логику и требующую одного инстанса. Хэндлер именно оно и есть.
Шина нужна для удобства. Мы в шину кидаем сообщение (дай нам пост 15, запиши новый пост, поменяй значение поля поста итд), шина прочтет сообщение и сама его выполнит.
Все так работает - компоненты мы забираем по id, а не вручную создавая инстанс. Слушатели события автоматически получает уведомления от шины, а не в ручную мы их рассылаем итд.
Плюс необходимо иметь возможность конфигурировать все это дело, и, главное, иметь возможность "лениво" создавать объекты хэндлеров, инджектя туда зависимости.
чтобы хотелось:Sam Dark писал(а):По новым инстансам имеется ввиду http://www.yiiframework.com/doc-2.0/yii ... t()-detail?
задать в рамках бутстрапа расширения базовую реализацию интерфейса (видимо так: Yii::$container->set(interfaceClass, realisationClass)) с возможностью замены реализации на свою девелопером проекта.
дальше получать доступ к этой реализации, не создавая новых инстансов (типа как Yii::$app->get('id')).
Причем у меня есть базовая реализация handlerLocator, которая должна быть передана в конструктор базовой реализации шины (Bus). И эти реализации могут быть девелопером заменены на свои. Судя по докам DI, так оно и задумывалось. Но как это на практике все вместе собрать?
PS Аж бесит. DI - ключевая парадигма всего на свете, а в yii никто это не юзает, а дока написана на самом базовом уровне.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: yii2-cqrs (имплементация cqrs)
Я всё это к чему... CQRS — это у нас разделение получения и изменения данных. Не более. Организовывать шину и/или представлять всё серией отдельных изменений с порога и полагать, что попроще CQRS не бывает и всем нужна эта самая eventual consistency... ну как-то это не очень. В очень многих проектах пользователи как раз ждут immediate consistency и именно это и требуется. При этом разделить получение и изменение данных и в этом случае бывает полезно.
Нравится Yii? Давайте сделаем его лучше!.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: yii2-cqrs (имплементация cqrs)
То есть вышла реализация под относительно частный случай, названная аббревиатурой общего принципа.
Нравится Yii? Давайте сделаем его лучше!.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: yii2-cqrs (имплементация cqrs)
По использованию контейнера где именно возникает проблема с кодом?
Нравится Yii? Давайте сделаем его лучше!.
Re: yii2-cqrs (имплементация cqrs)
шина здесь не причем. "CQRS — это у нас разделение получения и изменения данных" - вот базис. Остальное - это обвесы.Sam Dark писал(а):Я всё это к чему... CQRS — это у нас разделение получения и изменения данных. Не более. Организовывать шину и/или представлять всё серией отдельных изменений с порога и полагать, что попроще CQRS не бывает и всем нужна эта самая eventual consistency... ну как-то это не очень. В очень многих проектах пользователи как раз ждут immediate consistency и именно это и требуется. При этом разделить получение и изменение данных и в этом случае бывает полезно.
Разделение query/command удобно при разных хранилищах записи/получения, но разные хранилища не есть догма. В базовом случае это синхронные шины с единым хранилищем.
Re: yii2-cqrs (имплементация cqrs)
Почему? Если вам кажется, что реализован какой-то частный случай, то это неверно. Реализована парадигма. Шина получает сообщение, выполняет его. Все. CQRS больше ничего делать не должен.Sam Dark писал(а):То есть вышла реализация под относительно частный случай, названная аббревиатурой общего принципа.
https://github.com/zelenin/cqrs интерфейсы + basic implementation для "показать как можно"
https://github.com/zelenin/yii2-cqrs интеграция в yii2
Это же не стандартное расширение yii2 - подключил и работай.
Во взрослой жизни шина будет создавать события, валидировать входящие данные и прочее. Бери интерфейсы да имплементируй как тебе надо.
Поэтому и спрашивал как через di сделать возможность переопредления реализации интерфейса.
В симфони вот так банально: https://github.com/zelenin/cqrs-bundle/ ... rvices.yml
классы берутся из параметров, а параметры можно переопределить в конфиге проекта.
Кстати, в yii тоже можно заюзать параметры, но они в yii изначально бедные родственники.
Последний раз редактировалось zelenin 2015.12.07, 03:28, всего редактировалось 2 раза.
Re: yii2-cqrs (имплементация cqrs)
надоело уже честно говоря с этим разбираться. Пусть энтузиасты, если найдутся, допиливают до более красивого конфигурируемого варианта.Sam Dark писал(а):По использованию контейнера где именно возникает проблема с кодом?
Последний раз редактировалось zelenin 2015.12.07, 03:23, всего редактировалось 1 раз.
Re: yii2-cqrs (имплементация cqrs)
да я шучу конечно, но в каждой шутке есть доля шутки как написано на доске объявлений в местном плановом отделе на АльфеSam Dark писал(а):DI !== 42
Центавра.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: yii2-cqrs (имплементация cqrs)
Вопрос в том, как эту парадигму обзывать. По мне так это уже не CQRS, а как минимум CQRS + шина + eventual consistency. Я понимаю, что очень многие не представляют CQRS без обвеса, но это же не правильно.Почему? Если вам кажется, что реализован какой-то частный случай, то это неверно. Реализована парадигма. Шина получает сообщение, выполняет его. Все. CQRS больше ничего делать не должен.
Нравится Yii? Давайте сделаем его лучше!.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: yii2-cqrs (имплементация cqrs)
И действительно, CommandBus и CQRS две вещи не связанные между собой, хотя и используется часто вместе. Честно говоря не увидел расширения. Просто несколько интерфейсов, и непонятно зачем, пустых абстрактных классов, имплементирующие интерфейсы.
На гитхабе есть тонна уже готовых хороших расширений для этого, с тестами и плюшками.
Фреймворк-независимых и очень легко интегрируются c Yii, вкл. Yii1.
На гитхабе есть тонна уже готовых хороших расширений для этого, с тестами и плюшками.
Фреймворк-независимых и очень легко интегрируются c Yii, вкл. Yii1.
Жду Yii 3!
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: yii2-cqrs (имплементация cqrs)
https://github.com/zelenin/cqrs/blob/ma ... us.php#L20
Это кстати точно интерфейс Bus? Бывают CommandBus которые имеют несколько обработчиков для команд.
Возможно эта статья тебе знакомая, оставлю на всякий случай, очень хорошая ИМХО
http://php-and-symfony.matthiasnoback.n ... mmand-bus/
Это кстати точно интерфейс Bus? Бывают CommandBus которые имеют несколько обработчиков для команд.
Возможно эта статья тебе знакомая, оставлю на всякий случай, очень хорошая ИМХО
http://php-and-symfony.matthiasnoback.n ... mmand-bus/
Жду Yii 3!
Re: yii2-cqrs (имплементация cqrs)
это получение конкретного хэндлера, например с помощью handler locator.slavcodev писал(а):https://github.com/zelenin/cqrs/blob/ma ... us.php#L20
Это кстати точно интерфейс Bus? Бывают CommandBus которые имеют несколько обработчиков для команд.
да конечно. я по теме прочел практически все, вплоть до cqrs in journey от MS)slavcodev писал(а):Возможно эта статья тебе знакомая, оставлю на всякий случай, очень хорошая ИМХО
http://php-and-symfony.matthiasnoback.n ... mmand-bus/
Собственно в статье описано как можно идею расширить за счет различных обвесов.
Re: yii2-cqrs (имплементация cqrs)
вообще я понял о чем вы. Вы правы. Надо подправить.slavcodev писал(а):Это кстати точно интерфейс Bus? Бывают CommandBus которые имеют несколько обработчиков для команд.
Re: yii2-cqrs (имплементация cqrs)
Да, есть setSingleton().zelenin писал(а):...и юзать одним инстансом (Yii::$container->get(..) возвращает всегда новый инстанс).
Re: yii2-cqrs (имплементация cqrs)
не хочу даже больше копаться в этом. удалю репозиторий.ElisDN писал(а):Да, есть setSingleton().zelenin писал(а):...и юзать одним инстансом (Yii::$container->get(..) возвращает всегда новый инстанс).