Skip to main content

Snapshots

A snapshot is a cache of aggregate state at a particular event version. It does not replace the event stream. On load, AggregateRepository applies the snapshot and replays only events newer than the snapshot version.

Make an aggregate snapshotable​

Implement SnapshotableAggregateInterface:

public function shouldTakeSnapshot(): bool;
public function getSnapshotClass(): string;
public function getSnapshotState(): array;
public function getSnapshotVersion(): EventVersion;
public function getAggregateId(): EntityIdentifierInterface;
public function applySnapshot(SnapshotInterface $snapshot): void;

The snapshot version must be the version represented by the returned state. The repository uses that version as the exclusive lower bound for tail replay.

Configure snapshot storage​

The facade accepts snapshot storage, a snapshot factory, and optional snapshot history storage:

use DomainFlow\EventSourcing\Facade\EventSourcingFacade;
use DomainFlow\EventSourcing\Snapshot\GenericSnapshotFactory;
use DomainFlow\EventSourcing\Snapshot\InMemorySnapshotStorage;
use DomainFlow\EventSourcing\Storage\InMemoryEventStorage;

$facade = new EventSourcingFacade(
new InMemoryEventStorage(),
new InMemorySnapshotStorage(),
new GenericSnapshotFactory(),
);

GenericSnapshotFactory creates GenericSnapshot by default. A custom snapshot class can use the constructor shape (aggregateId, version, state, occurredOn); otherwise provide your own SnapshotFactoryInterface.

When shouldTakeSnapshot() returns true, persist() generates and stores a snapshot after storing the aggregate's uncommitted events. You can also call createAndPersistSnapshot() explicitly. It returns null for a non-snapshotable aggregate.

Snapshot history​

SnapshotHistoryStorageInterface stores multiple versions per aggregate. It is separate from SnapshotStorageInterface, which represents the current snapshot used for loading. The history interface supports persisting a version, retrieving all versions, deleting one version, and deleting all versions.

Deletion and fallback​

EventSourcingFacade::delete() removes the aggregate's events and snapshot data through the configured repository. If a snapshot cannot be trusted or does not match the aggregate's declared type, the repository falls back to a full event replay.