Exceptions как и с чем

Вурдалак

Продвинутый новичок
мыло я отправлю через bus. те оно отправится если транзакция была завершена и демон не упал.
А когда транзакция будет завершена?

Проверяются ли там права? Проверяются ли те же права при вызове из CLI?
 

WMix

герр M:)ller
Партнер клуба
ну или другими словами это другой процесс который выполнит физическую отправку
 

Вурдалак

Продвинутый новичок
ну или другими словами это другой процесс который выполнит физическую отправку
Я ничего не понял. У меня есть вполне конкретное событие UserWasRenamed, которое генерируется после выполнения команды RenameUser. Как мне отправить письмо по событию UserWasRenamed? Кем гарантируется, что это не попадёт в транзакцию? Ведь если я правильно понимаю, вот это:

> $router['RenameUser']->handle(['id'=>42, 'name' => 'Alice']);

либо запускает все middleware, где проверяются права, специфичные для какой-то конкретной точки (web, админка, CLI, ...) и стартует транзакция,
либо ни один middleware, а это значит не стартует транзакция.

Оба варианта неприемлимы.

Или оно работает как-то по-другому?

Более того, вот это соглашение на строках и массивах вместо new RenameUser(...) с точным набором параметров и автокомплитом — это треш какой-то. В каком месте это удобнее?
 

WMix

герр M:)ller
Партнер клуба
да ну, все проще, $this->queue->add('UserWasRenamed', serialize($user)); те это убежало в очередь, ну или throw. дальше обьяснить?
 

Вурдалак

Продвинутый новичок
Конечно. Я ведь говорил о синхронных обработчиках:
Что ты будешь делать, если у тебя есть событие, по которому синхронно выполняется другой обработчик
А ты мне рассказываешь про асинхронные события. Обрабатываться они будут где-то в очередном middleware, правильно?

По поводу этого:
Ведь если я правильно понимаю, вот это:

> $router['RenameUser']->handle(['id'=>42, 'name' => 'Alice']);

либо запускает все middleware, где проверяются права, специфичные для какой-то конкретной точки (web, админка, CLI, ...) и стартует транзакция,
либо ни один middleware, а это значит не стартует транзакция.
Ты что-нибудь скажешь?
 

WMix

герр M:)ller
Партнер клуба
ну я в общем сказал, что http-action у меня unitofwork. ну те одно дело сменить состояние другое дело запустить задачу worker на отправку письма. синхронно было изменение состояния, 2х POST будут работать синхронно. а middleware на запрос действительно делает одну из задач. в описанном оно просто достанет пользователя по id и вернет обьект, избавив тебя от задачи это делать. в случае если она не сможет это сделать, она не попросит менять состояние и ответит клиенту 4хх ошибкой, иначе это ошибка 5хх
 

Вурдалак

Продвинутый новичок
в описанном оно просто достанет пользователя по id и вернет обьект, избавив тебя от задачи это делать
Я не совсем понял, о какой «задаче» ты говоришь? Ты заменил строчку
PHP:
$user = $this->userRepository->find($command->userId);
на строчку
PHP:
public function myAction(User $user)
 

WMix

герр M:)ller
Партнер клуба

Вурдалак

Продвинутый новичок
id стало пользователем, проверилось возможность (существование) выбора и прав выбора пользователя, грубо 400, 403 или 404
То есть ты смешиваешь проверки из домена проверки прав для web и «чистую» бизнес-логику.

Как же ты подменяешь эти проверки для разных точек входа? Ты так и не ответил.
 

WMix

герр M:)ller
Партнер клуба
точка это action, есть довольно повторяющие вещи которые происходят до этого действия ( в нашем случае, создание обьекта). до действия я проверяю прав ли клиент 4хх, а середине или конце либо 200 либо i fucked up
 

Вурдалак

Продвинутый новичок
точка это action, есть довольно повторяющие вещи которые происходят до этого действия ( в нашем случае, создание обьекта). до действия я проверяю прав ли клиент 4хх, а середине или конце либо 200 либо i fucked up
Ты не сообщаешь новой информации, игнорируешь вопросы.
 

WMix

герр M:)ller
Партнер клуба

Вурдалак

Продвинутый новичок
не знаю что хочешь услышать, как определить 403 или 404?
Не тупи, ещё раз: как ты подменяешь правила для CLI, где эти «правила» нужно полностью вырубить, как ты подменяешь для админки, где нередко используются совершенно другие пользователи (в плане модели; другие таблицы и базы), для старого API, где из-за BC иногда приходится идти на какие-то компромиссы и т.д.? И как вообще в том же CLI или любом другом протоколе, отличном от HTTP, ты конвертируешь 403, ... и прочее в другой формат? Что если данных для нового формата недостаточно (из HTTP-кода не получится «вытащить» более конкретную ошибку)?

Ты экономишь на какой-то фигне, внедряя адский треш, разве ты этого не чувствуешь? Вместо явного делаешь неявное. Ты фактически фаршируешь command handler HTTP-related трешем, приправленным правилами для конкретного порта (в терминах hexagonal architecture). Ты по факту просто удаляешь service layer (aka application layer).

По поводу подмешивания других транзакций через другие middlewares ты тоже не ответил: что если добавить middleware, который замечательно работает, пишет какие-то логи в БД, но при смене connection на тот, что совпадает с тем, по которому происходит изменение User'а, обнаруживается, что логи иногда тупо не пишутся, потому что происходит rollback, связанный с User?
 

WMix

герр M:)ller
Партнер клуба
command которая под worker работает это не action там нет request и не нужен view там нет http-excteption, она пишется немного иначе но при этом там переиспользуются сервисы.
 

WMix

герр M:)ller
Партнер клуба
По поводу подмешивания других транзакций через другие middlewares ты тоже не ответил: что если добавить middleware, который замечательно работает, пишет какие-то логи в БД, но при смене connection на тот, что совпадает с тем, по которому происходит изменение User'а, обнаруживается, что логи иногда тупо не пишутся, потому что происходит rollback, связанный с User?
я уверен, что мое решение не будет отличаться от твоего, как если бы у тебя писался бы лог в середине транзакции, в ту же базу. вероятнее всего придется отложить запись. мне конечно мало представляется такой сценарий, ну да пусть будет.
И как вообще в том же CLI или любом другом протоколе, отличном от HTTP, ты конвертируешь 403,
там нет вобщето http.
Ты по факту просто удаляешь service layer (aka application layer).
вероятнее всего у нас разные понятие application. в нашем случае application это сборка приложения, di, em, routing, input/output/error-handler. service же это часть модели который работает с mappers и запускает конечные методы в сущностях.
 

Вурдалак

Продвинутый новичок
command которая под worker работает это не action там нет request и не нужен view там нет http-excteption, она пишется немного иначе но при этом там переиспользуются сервисы.
Если я правильно понимаю, ты сочиняешь на ходу, и в реальности пока это не используешь. Сейчас ты уже утверждаешь, что копипастишь детали command handler под каждый формат. Немного ранее же ты на мой аналогичный вопрос отвечал так:
как угодно, так нравится?
PHP:
$router['RenameUser']->handle(['id'=>42, 'name' => 'Alice']);
«Кручу-верчу, обмануть хочу».
 

WMix

герр M:)ller
Партнер клуба
Немного ранее же ты на мой аналогичный вопрос отвечал так:
есть рутинг, он естественно для консольных приложений и хттп действий разный, но и в том и в другом случае вызов одинаковый

копипастишь детали command handler под каждый формат
чаще всего (практически всегда) консольные команды имеют совершенно другие задачи нежеле web там не надо копипастить.
 
Сверху