Подскажите в какую сторону смотреть если надо диспатчить не совсем доменные события только после определенного момента? (Обычно после сохранения ентити в бд)
Делаю так:
$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й вариант мне кажется вообще мрак, одно дело хранить события внутри ентити, совсем другое в сервисе который можно реюзать и наломать дров