andreo / eventsauce-snapshotting
Extended snapshot components for EventSauce.
Installs: 3 063
Dependents: 2
Suggesters: 1
Security: 0
Stars: 3
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: >=8.2
- doctrine/dbal: ^3.5
- eventsauce/eventsauce: ^3.0
- eventsauce/uuid-encoding: ^0.4
Requires (Dev)
- andreo/eventsauce-aggregate: dev-main
- eventsauce/test-utilities: ^3.0
- phpstan/phpstan: ^1.3
- phpunit/phpunit: ^9.4
- roave/security-advisories: dev-latest
README
Extended snapshot components for EventSauce
Installation
composer require andreo/eventsauce-snapshotting
Previous versions
Requirements
- PHP >=8.2
- Doctrine Dbal ^3.1
Doctrine snapshot repository
use Andreo\EventSauce\Snapshotting\Doctrine\DoctrineSnapshotRepository; new DoctrineSnapshotRepository( connection: $connection, // Doctrine\DBAL\Connection tableName: $tableName, serializer: $serializer, // Andreo\EventSauce\Snapshotting\Serializer\SnapshotStateSerializer uuidEncoder: $uuidEncoder, // EventSauce\UuidEncoding\UuidEncoder tableSchema: $tableSchema // Andreo\EventSauce\Snapshotting\Repository\Table\SnapshotTableSchema )
Versioning
Repository
use Andreo\EventSauce\Snapshotting\Versioned\AggregateRootRepositoryWithVersionedSnapshotting; new AggregateRootRepositoryWithVersionedSnapshotting( aggregateRootClassName: $aggregateRootClassName, messageRepository: $messageRepository regularRepository: $regularRepository, // EventSauce\EventSourcing\AggregateRootRepository snapshotVersionInflector: $snapshotVersionInflector, // Andreo\EventSauce\Snapshotting\Repository\Versioned\SnapshotVersionInflector snapshotVersionComparator: $snapshotVersionComparator // Andreo\EventSauce\Snapshotting\Repository\Versioned\SnapshotVersionComparator );
Versioned Snapshot State
use Andreo\EventSauce\Snapshotting\Versioned\VersionedSnapshotState; final class FooSnapshotStateV2 implements VersionedSnapshotState { public static function getSnapshotVersion(): int|string|Stringable { return 2; } }
Example of aggregate
use Andreo\EventSauce\Snapshotting\Aggregate\VersionedSnapshottingBehaviour; use EventSauce\EventSourcing\AggregateRootBehaviour; use EventSauce\EventSourcing\AggregateRootId; use EventSauce\EventSourcing\Snapshotting\AggregateRootWithSnapshotting; final class FooAggregate implements AggregateRootWithSnapshotting { use AggregateRootBehaviour; use VersionedSnapshottingBehaviour; // Create snapshot method must have type hint of VersionedSnapshotState implementation (with default SnapshotVersionInflector) protected function createSnapshotState(): FooSnapshotStateV2 { return new FooSnapshotStateV2(); } protected static function reconstituteFromSnapshotState(AggregateRootId $id, $state): AggregateRootWithSnapshotting { assert($state instanceof FooSnapshotStateV2); } }
Conditional Strategy
interface ConditionalSnapshotStrategy { public function canStoreSnapshot(AggregateRootWithSnapshotting $aggregateRoot): bool; }
Built-in strategies
Every n event
use Andreo\EventSauce\Snapshotting\Conditional\AggregateRootRepositoryWithConditionalSnapshot;use Andreo\EventSauce\Snapshotting\Conditional\EveryNEventConditionalSnapshotStrategy; new AggregateRootRepositoryWithConditionalSnapshot( regularRepository: $regularRepository, // EventSauce\EventSourcing\Snapshotting\AggregateRootRepositoryWithSnapshotting conditionalSnapshotStrategy: new EveryNEventConditionalSnapshotStrategy(numberOfEvents: 200) # or your implementation );