Message Decorator
There are usecases where you want to add some extra context to your events like metadata which is not directly relevant
for your domain. With MessageDecorator
we are providing a solution to add this metadata to your events. The metadata
will also be persisted in the database and can be retrieved later on.
Built-in decorator
We offer a few decorators that you can use.
RecordedOnDecorator
Each message needs a RecordedOn
time. The RecordedOnDecorator
is needed so that this is added to the message.
This decorator needs a clock implementation.
use Patchlevel\EventSourcing\Clock\SystemClock;
use Patchlevel\EventSourcing\EventBus\Decorator\RecordedOnDecorator;
$clock = new SystemClock();
$decorator = new RecordedOnDecorator($clock);
Warning
A RecordedOn
time must always be created.
Either this decorator must always be added or an appropriate replacement must be provided.
SplitStreamDecorator
In order to use the split stream feature, the SplitStreamDecorator
must be added.
use Patchlevel\EventSourcing\EventBus\Decorator\SplitStreamDecorator;
use Patchlevel\EventSourcing\Metadata\Event\AttributeEventMetadataFactory;
$eventMetadataFactory = new AttributeEventMetadataFactory();
$decorator = new SplitStreamDecorator($eventMetadataFactory);
ChainMessageDecorator
To use multiple decorators at the same time, one can use the ChainMessageDecorator
.
use Patchlevel\EventSourcing\EventBus\Decorator\ChainMessageDecorator;
$decorator = new ChainMessageDecorator([
$decorator1,
$decorator2,
]);
Use decorator
To use the message decorator, you have to pass it to the DefaultRepositoryManager
.
use Patchlevel\EventSourcing\EventBus\Decorator\ChainMessageDecorator;
use Patchlevel\EventSourcing\EventBus\Decorator\RecordedOnDecorator;
use Patchlevel\EventSourcing\Repository\DefaultRepositoryManager;
$decorator = new ChainMessageDecorator([
new RecordedOnDecorator($clock),
new SplitStreamDecorator($eventMetadataFactory)
]);
$repositoryManager = new DefaultRepositoryManager(
$aggregateRootRegistry,
$store,
$eventBus,
null,
$decorator
);
$repository = $repositoryManager->get(Profile::class);
Warning
We also use the decorator to fill in the RecordedOn
time.
If you want to add your own decorator or the SplitStreamDecorator,
then you need to make sure to add the RecordedOnDecorator
as well.
Note
You can find out more about repository here.
Create own decorator
You can also use this feature to add your own metadata to your events. For this the have an extra methods on Message
to add data withCustomHeader
and to read this data later on customHeader
.
use Patchlevel\EventSourcing\EventBus\Message;
final class OnSystemRecordedDecorator implements MessageDecorator
{
public function __invoke(Message $message): Message
{
return $message->withCustomHeader('system', 'accounting_system');
}
}
Note
The Message is immutable, for more information look up here.
Tip
You can also set multiple headers with withCustomHeaders
which expects an hashmap.