dsantang/domain-events

一个简单的包,可实现域事件的创建和缓存。

v0.5.0 2021-10-12 14:02 UTC

This package is auto-updated.

Last update: 2024-09-12 20:29:07 UTC


README

CI workflow Scrutinizer Code Quality Code Coverage Build Status

一个简单的包,引导域事件的创建和分发。

安装

建议的安装方法是使用 composer

php composer.phar require dsantang/domain-events

使用方法

此包旨在提供对应用程序域事件的抽象。域事件是聚合在域事务过程中可以引发的事件。它们捕获在域中发生的事情的一个实例。以下是一个域事件的示例

<?php

use Dsantang\DomainEvents\DomainEvent;

final class OrderSent implements DomainEvent, DeletionAware
{
    public const EVENT_NAME = 'order-sent';

    /**
     * @var OrderId
     */
    private $orderId;

    /**
     * @var Address
     */
    private $address;

    /**
     * @var DateTimeImmutable
     */
    private $timestamp;

    public function __construct(OrderId $orderId, Address $address, DateTimeImmutable $timestamp)
    {
        // ...
    }

    /**
     * This is the only interface method that needs to be implemented.
     * This method should return an application-unique event name.
     */
    public function getEventName(): string
    {
        return self::EVENT_NAME;
    }
    
    public function expelDeletionEvents(): DomainEvent
    {
        return new OrderDeleted();
    }

    // ...
}

聚合删除

有时,聚合的删除也是一个相关的事件。在这种情况下,聚合自身无法抛出该事件,因为它很可能是被您的ORM删除的。
为了解决这个问题,您可以实现 DeletionAware 接口来通知您的ORM,该聚合的删除应引发一个事件。

使用事务

域事件可以在聚合中暂时缓存,直到事务完成。一旦事务完成,并且您的聚合状态已 正确持久化 到您的数据存储中,已发生的域事件应由您的应用程序妥善处理。

为了在聚合中暂时 缓存/检索这些事件,您可以依靠此库提供的简单的 EventsRegistry 特性。

示例

final class Order implements EventAware
{
    /**
     * Use this trait to cache your domain event.
     */
    use EventsRegistry;

    // ...

    public function send(): void
    {
        // Domain logic is executed.

        // ...

        // Once the domain transaction is completed, the event must be cached via this method call:
        $this->triggeredA(new OrderSent(...));
    }

    // ...
}

由于每个应用程序都有其自己的聚合状态持久化方式,因此 此库不提供自动分发这些事件的方法,这需要实现者来完成。

使用 Doctrine ORM 的用户可以依赖一个 开箱即用的自动事件分发,它仅在 Doctrine 的事务完成后启动。包名为

dsantang/domain-events-doctrine