andreo / eventsauce-upcasting
EventSauce 扩展向上转型组件。
3.0
2023-02-02 19:05 UTC
Requires
- php: >=8.2
- eventsauce/eventsauce: ^3.0
Requires (Dev)
- phpstan/phpstan: ^1.3
- phpunit/phpunit: ^9.4
- roave/security-advisories: dev-latest
README
EventSauce 扩展向上转型组件
安装
composer require andreo/eventsauce-upcasting
以前版本文档
要求
- PHP >=8.2
消息向上转型器
use Andreo\EventSauce\Upcasting\MessageUpcaster\MessageUpcaster; use EventSauce\EventSourcing\Message; final class FooUpcaster implements MessageUpcaster { public function upcast(Message $message): Message { $event = $message->payload(); if (!$event instanceof FooEvent)) { return $message; } return new Message(new FooEventV2()); } }
多个消息向上转型器
use Andreo\EventSauce\Upcasting\MessageUpcasterChain; new MessageUpcasterChain( new SomeUpcaster(), new AnotherUpcaster(), )
作为消息序列化器的向上转型器
用于 MessageRepository
use Andreo\EventSauce\Upcasting\UpcastingMessageObjectSerializer; new UpcastingMessageObjectSerializer( messageSerializer: $messageSerializer, // default EventSauce\EventSourcing\Serialization\MessageSerializer upcaster: new MessageUpcasterChain(new SomeUpcaster()) )
事件猜测
use EventSauce\EventSourcing\Message; use Andreo\EventSauce\Upcasting\MessageUpcaster\MessageUpcaster; use Andreo\EventSauce\Upcasting\MessageUpcaster\Event; final class FooUpcaster implements MessageUpcaster { #[Event(event: FooEvent::class)] public function upcast(Message $message): Message { $event = $message->payload(); assert($event instanceof FooEvent); return new Message(new FooEventV2()); } }
处理聚合事件
默认情况下,EventSauce 根据方法名 约定 apply{EventClassName} 应用事件。
因此,您需要重命名聚合中的方法
use EventSauce\EventSourcing\AggregateRoot; use EventSauce\EventSourcing\AggregateRootBehaviour; final class FooAggregate implements AggregateRoot { use AggregateRootBehaviour; // before applyFooEvent public function applyFooEventV2(FooEventV2 $event): void { } }
您可以通过使用 组件 跳过此步骤