andreo/eventsauce-upcasting

EventSauce 扩展向上转型组件。

3.0 2023-02-02 19:05 UTC

This package is auto-updated.

Last update: 2024-08-30 01:32:26 UTC


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
    {
    }
}

您可以通过使用 组件 跳过此步骤