dsantang / domain-events
一个简单的包,可实现域事件的创建和缓存。
v0.5.0
2021-10-12 14:02 UTC
Requires
- php: ^7.4 || ^8.0
Requires (Dev)
- doctrine/coding-standard: ^9.0
- infection/infection: ^0.25
- phpstan/phpstan: ^0.12
- phpstan/phpstan-strict-rules: ^0.12
- phpunit/phpunit: ^9.0
- squizlabs/php_codesniffer: ^3.6
Suggests
- dsantang/domain-events-doctrine: To automatically dispatch and listen to this package's domain events when a doctrine transaction is finished.
This package is auto-updated.
Last update: 2024-09-12 20:29:07 UTC
README
一个简单的包,引导域事件的创建和分发。
安装
建议的安装方法是使用 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