Command Controller

Redjik

Джедай-мастер
Пропала ветка ищу готовое решение?

Короче, ищу готовое решение, может есть у кого ;)

Нужен класс/бандл для контроля потока выполнения команд.
Хотя бы чтобы можно было делать undoAll, вообще желательно, чтобы умел undo, state, load, retry, логирование, отлов ошибок.
В идеале все это покрыто тестами.

Сам написал половину, но чото так лень =)))), а задача вроде как тривиальная =)

Сама бизнес задача, которую нужно решить.
Есть платежная система с кривым апи, есть менеджеры с кривой бизнес моделью, с которыми устал спорить.
Из-за ограничений апи нет возможности сделать транзакцию на стороне платежной системы.
Обновление пластиковой карты пользователя (payment method)
Запросы.
* Добавляем инфу карты пользователя в систему.
* Set user.autopay to false
* Убираем user.default_payment_method_id
* Ставим user.default_payment_method_id на новую карту
* Set user.autopay to true
* Удаляем старую карту

Мопед не мой - я просто разместил обьяву... короче вся эта идея с удалением итп, не моя, я спорил часов 10 уже, чтобы поменяли логику.

Вот для того, чтобы все это делать более менее атомарно, пишу команды c handle - выполнение запроса, undo - откат.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
готовое решение для 2pc? ;)

я не знаю платежную систему, на стороне которой можно было бы сделать транзакцию, не очень понимаю твое возмущение,
это если мы проектируем свой биллинг или хотя бы можем свои сервисы создавать, еще можно что-то придумать, а так ситуация стандартная
 
Последнее редактирование:

Redjik

Джедай-мастер
это не то
у меня есть несколько наборов комманд, которые нужно выполнить последовательно, при фейле нужно откатить предыдущие, обычная транзакция

ЗЫ. ну и само собой куча мелочей типа
- при фейле из-за проблем с апи, сделать ретрай
- при фейле во время отката - писать письма админу
итп
 

Вурдалак

Продвинутый новичок
Если я правильно тебя понял, такая штука называется saga. Выглядит примерно так: https://github.com/qandidate-labs/broadway/blob/master/examples/saga/ReservationSaga.php

Если перечисленные пункты выше выполняются в рамках одного запроса, то ты можешь просто иметь listener, который слушает события и посылает команды. В случае удачи/фейла команды тебе нужно будет генерировать соответствующие события.

Но без сохранения состояния это будет выглядеть хрупко. Если на каком-то из шагов что-то упадет, то будет проблема.
 

Redjik

Джедай-мастер
Уже лучше. Как то я и забыл у бродвеев про эту смесь State и Command.
 

Redjik

Джедай-мастер
State, да, и до меня сейчас дошло, что мне этот вариант больше нравится, чем колхозить undo
 

Redjik

Джедай-мастер
https://en.wikipedia.org/wiki/State_pattern

прям все по учебнику ;)
просто я не смог допереть, что команды мне надо воткнуть в этот пэттерн, когда размышлял над задачей, почему-то сразу его откинул

ЗЫ. а кто виноват? конечно Laravel, он же отупляет =)
 

Вурдалак

Продвинутый новичок
GoF Command — это по сути сервис, который сам себя выполняет; в CQRS — это value object, просто message, который выполняется в command handler'е.
 

Redjik

Джедай-мастер
не вижу особо разницы, пэттерн один и тот же, просто в CQRS добавляется абстракция - Command -> CommandBus -> CommandHandler
что является логичным развитием пэттерна
 

Вурдалак

Продвинутый новичок
Я просто не привык называть разные вещи одинаково, но если тебе так проще жить, то окей.

Тот command, что в CQRS, принято называть command message pattern.
 
Сверху