yii2-cqrs (имплементация cqrs)

Выкладываем свои наработки
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.06, 18:04

Базовая имплементация CQRS https://en.wikipedia.org/wiki/Command%E ... separation

Интегрирует пакет https://github.com/zelenin/cqrs в Yii2. Пакет требует 5.5+ (поскольку изначально разрабатывался в контексте Symfony 3), поэтому, боюсь, на 5.4 не поднимется. Для желающих можно будет что-нибудь придумать.

Думаю, полезно будет только при полном следовании DDD. Для обертки над ActiveRecord смысла не имеет, кроме как "пощупать".

Аватара пользователя
samdark
Администратор
Сообщения: 9142
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение samdark » 2015.12.06, 18:15

А зачем там шина?

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.06, 19:00

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
Администратор
Сообщения: 9142
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение samdark » 2015.12.06, 19:34

Вообще странно, конечно, это в сервисы тащить. Если бы не шина, не было бы нужды в этом.

По новым инстансам имеется ввиду http://www.yiiframework.com/doc-2.0/yii ... t()-detail?

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.06, 20:32

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
Администратор
Сообщения: 9142
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение samdark » 2015.12.07, 02:47

Я всё это к чему... CQRS — это у нас разделение получения и изменения данных. Не более. Организовывать шину и/или представлять всё серией отдельных изменений с порога и полагать, что попроще CQRS не бывает и всем нужна эта самая eventual consistency... ну как-то это не очень. В очень многих проектах пользователи как раз ждут immediate consistency и именно это и требуется. При этом разделить получение и изменение данных и в этом случае бывает полезно.

Аватара пользователя
samdark
Администратор
Сообщения: 9142
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение samdark » 2015.12.07, 02:51

То есть вышла реализация под относительно частный случай, названная аббревиатурой общего принципа.

Аватара пользователя
samdark
Администратор
Сообщения: 9142
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение samdark » 2015.12.07, 02:55

По использованию контейнера где именно возникает проблема с кодом?

Аватара пользователя
samdark
Администратор
Сообщения: 9142
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение samdark » 2015.12.07, 02:56

DI !== 42 ;)

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.07, 03:07

Sam Dark писал(а):Я всё это к чему... CQRS — это у нас разделение получения и изменения данных. Не более. Организовывать шину и/или представлять всё серией отдельных изменений с порога и полагать, что попроще CQRS не бывает и всем нужна эта самая eventual consistency... ну как-то это не очень. В очень многих проектах пользователи как раз ждут immediate consistency и именно это и требуется. При этом разделить получение и изменение данных и в этом случае бывает полезно.
шина здесь не причем. "CQRS — это у нас разделение получения и изменения данных" - вот базис. Остальное - это обвесы.
Разделение query/command удобно при разных хранилищах записи/получения, но разные хранилища не есть догма. В базовом случае это синхронные шины с единым хранилищем.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.07, 03:11

Sam Dark писал(а):То есть вышла реализация под относительно частный случай, названная аббревиатурой общего принципа.
Почему? Если вам кажется, что реализован какой-то частный случай, то это неверно. Реализована парадигма. Шина получает сообщение, выполняет его. Все. CQRS больше ничего делать не должен.

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 раза.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.07, 03:12

Sam Dark писал(а):По использованию контейнера где именно возникает проблема с кодом?
надоело уже честно говоря с этим разбираться. Пусть энтузиасты, если найдутся, допиливают до более красивого конфигурируемого варианта.
Последний раз редактировалось zelenin 2015.12.07, 03:23, всего редактировалось 1 раз.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.07, 03:16

Sam Dark писал(а):DI !== 42 ;)
да я шучу конечно, но в каждой шутке есть доля шутки как написано на доске объявлений в местном плановом отделе на Альфе
Центавра.

Аватара пользователя
samdark
Администратор
Сообщения: 9142
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение samdark » 2015.12.07, 11:14

Почему? Если вам кажется, что реализован какой-то частный случай, то это неверно. Реализована парадигма. Шина получает сообщение, выполняет его. Все. CQRS больше ничего делать не должен.
Вопрос в том, как эту парадигму обзывать. По мне так это уже не CQRS, а как минимум CQRS + шина + eventual consistency. Я понимаю, что очень многие не представляют CQRS без обвеса, но это же не правильно.

Аватара пользователя
slavcodev
Сообщения: 3133
Зарегистрирован: 2009.04.02, 21:42
Откуда: Altea, Spain
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение slavcodev » 2015.12.09, 01:35

И действительно, CommandBus и CQRS две вещи не связанные между собой, хотя и используется часто вместе. Честно говоря не увидел расширения. Просто несколько интерфейсов, и непонятно зачем, пустых абстрактных классов, имплементирующие интерфейсы. :(

На гитхабе есть тонна уже готовых хороших расширений для этого, с тестами и плюшками.
Фреймворк-независимых и очень легко интегрируются c Yii, вкл. Yii1.
Жду Yii 3!

Аватара пользователя
slavcodev
Сообщения: 3133
Зарегистрирован: 2009.04.02, 21:42
Откуда: Altea, Spain
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение slavcodev » 2015.12.09, 01:38

https://github.com/zelenin/cqrs/blob/ma ... us.php#L20

Это кстати точно интерфейс Bus? Бывают CommandBus которые имеют несколько обработчиков для команд.

Возможно эта статья тебе знакомая, оставлю на всякий случай, очень хорошая ИМХО
http://php-and-symfony.matthiasnoback.n ... mmand-bus/
Жду Yii 3!

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.09, 01:52

slavcodev писал(а):https://github.com/zelenin/cqrs/blob/ma ... us.php#L20

Это кстати точно интерфейс Bus? Бывают CommandBus которые имеют несколько обработчиков для команд.
это получение конкретного хэндлера, например с помощью handler locator.
slavcodev писал(а):Возможно эта статья тебе знакомая, оставлю на всякий случай, очень хорошая ИМХО
http://php-and-symfony.matthiasnoback.n ... mmand-bus/
да конечно. я по теме прочел практически все, вплоть до cqrs in journey от MS)
Собственно в статье описано как можно идею расширить за счет различных обвесов.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2015.12.09, 02:15

slavcodev писал(а):Это кстати точно интерфейс Bus? Бывают CommandBus которые имеют несколько обработчиков для команд.
вообще я понял о чем вы. Вы правы. Надо подправить.

Аватара пользователя
ElisDN
Сообщения: 5358
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: yii2-cqrs (имплементация cqrs)

Сообщение ElisDN » 2016.01.22, 23:11

zelenin писал(а):...и юзать одним инстансом (Yii::$container->get(..) возвращает всегда новый инстанс).
Да, есть setSingleton().

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cqrs (имплементация cqrs)

Сообщение zelenin » 2016.01.22, 23:20

ElisDN писал(а):
zelenin писал(а):...и юзать одним инстансом (Yii::$container->get(..) возвращает всегда новый инстанс).
Да, есть setSingleton().
не хочу даже больше копаться в этом. удалю репозиторий.

Ответить