Contents
Messenger
Symfony Event Dispatcher vs Domain events
-
Events are mutable in symfony
-
plus the symfony component relies on strings as event names (but we can use class constants)
-
and string as method names (but also closures)
-
NB : The wiring is done in a compiler pass which does not belong to the domain .. ?
-
See difference between messenger and event dispatcher
- Messenger allows your handlers to be called asynchronously, whereas listeners to events from the EventDispatcher are always synchronous.
- EventDispatcher communicates back
- if you simply want to say “this thing happened” and you don’t need any feedback from possible listeners or handlers, use Messenger.
- NB : So for domain events we could actually use messenger ..!
Difference between a command bus and an event bus
- each command should have exactly one handler: we’re commanding that something perform a specific action
- But an event is something that’s usually dispatched after that action is taken, and the purpose is to allow anyone else to take any secondary action - to react to the action.
- See symfony’s multiple bus example implementing CQRS
- The command bus would use a validation NB : not necessary, validation can be done before event generation) and transaction middleware (don’t need to call flush in the handler ! also not necessary if transactions are handled elsewhere)
- The event bus would have
default_middleware: allow_no_handlers
- Plus we can disable autowiring and tag handlers to work only with a specific bus
- The query bus pattern is fine but is not typed in symfony
Priority
- Transport priority : eg async / async_priority_high : changes the order in which messages are handled
- Handler priority : only useful when setting multiple handlers. The priority doesn’t change the order in which messages are handled, only the handlers for each message