Event store
A full-blown event store is beyond the scope of this documentation, but Codefy has an InMemoryEventStore
we can use. It implements the EventStore
interface that consists of two methods: append
, getAggregateHistoryFor
, and loadFromPlayhead
. We won’t be concerning ourselves with the third method in this documentation.
An append/commit should always be transactional. The whole set of DomainEvents
should be persisted, or none at all.
The EventStore
supports two read operations. One that fetches an aggregates complete history and the other that fetches a history from a version point.
TDD
Let’s test it out:
<?php
use App\Domain\Post\Post;
use App\Domain\Post\ValueObject\PostId;
use App\Domain\Post\ValueObject\Title;
use App\Domain\Post\ValueObject\Content;
use Codefy\Domain\EventSourcing\InMemoryEventStore;
use function expect;
use function it;
use function iterator_to_array;
it('should retrieve all events from the event store based on aggregate id.', function () {
$postId = new PostId(value: '1cf57c2c-5c82-45a0-8a42-f0b725cfc42f');
$post = Post::createPost(
postId: $postId,
title: new Title(value: 'Second Post Title'),
content: new Content(value: 'Another short form content.')
);
$events = $post->getRecordedEvents();
$eventStore = new InMemoryEventStore();
foreach ($events as $event) {
$eventStore->append(event: $event);
}
$iterator = $eventStore->getAggregateHistoryFor(
aggregateId: PostId::fromString(
postId: '1cf57c2c-5c82-45a0-8a42-f0b725cfc42f'
)
);
$aggregateHistory = iterator_to_array(iterator: $iterator->getIterator());
foreach ($aggregateHistory as $event) {
expect(value: $post->title())->toEqual(expected: $event->title());
expect(value: $post->aggregateId())->toEqual(expected: $event->aggregateId());
}
});
Github
An in-memory implementation of EventStore
is on Github.