доменные события только после определенного момента? (Обычно после сохранения ентити в бд)
Делаю так:
$entity = $someService->create(...);
flush();
dispatch($entity->releaseEvents());
return $this->json(['id' => $entity->getId()]);
и это отлично работает для доменных событий которые генерируются внутри ентити, но что если у меня сервис генерирует событие которое должно задиспатчиться после сохранения ентити?
Пример сервиса:
// SomeService::create(): Entity
$data = grabSomeData();
$entityId = uuid4();
$entity = new Entity($entityId, $data['field_1']...);
dispatch('dataGrabbed', $entityId, $data);
return $entity;
dataGrabbed событие надо диспатчить после flush()
но сам флаш происходит не в сервисе, а в контроллере, соответственно интересно как принято делать -
1. Перенести флаш в сервис и вызвать диспатч dataGrabbed + $entity->releaseEvents() ивентов в нём?
2. Добавить какой то глобальный сервис типа EventStore{events: Event[] + releaseEvents()} в который добавить dataGrabbedEvent, вызвать EventStore->releaseEvents() и задиспатчить его в контроллере после флаша
3. или есть готовое решение для этого?
1й вариант не нравится так как я не хочу что бы сервис решал когда делать флаш, может мне ещё надо что то сохранить в одной транзакции
2й вариант мне кажется вообще мрак, одно дело хранить события внутри ентити, совсем другое в сервисе который можно реюзать и наломать дров
Я юзаю декоратор с буфером и по флашу уже пускаю события дальше
Ну этот "буффер" меня пугает, у меня крутится долгоживущее приложение, в теории может произойти такое что в буфер попадут 2 события но они должны будут пойти дальше после разных флашей Сразу рождается решение типа $dispatchAfter = new DispatchAfterEntityFlushed($entity) buffer.push(Event, $dispatchAfter) Ну и после флаша проверять какие именно ивенты надо диспатчить, но тогда этот буфер может засоряться если событие произошло но ентити не флашится (по разным причинам, может где-то внутренняя валидация какого-то объекта не прошла), и как его чистить я пока не придумал, да и выглядит не очень..
Как такое может быть? Что значит ивенты для разных флашей?
Пхп не умирает, стейт не сбросился, что то вроде: $entity = $service->doSmth() // added Event to global application buffer flush() // exception thrown Dispatch($entity->releaseEvents) Получится что при ошибке - нам все равно что внутри ентити остались события, их не надо чистить, коллектор их сам уберёт, а вот в буфере на уровне апликации - надо, иначе утечки памяти будут, и второй запрос который флаш делает получится что задиспатчит события предыдущего который зафейлился
ну у тебя в любом случае есть какой-то этап жизненного цикла где ты подчищаешь вещи. Вот там и чисти буфер.
Обсуждают сегодня