vanio / doctrine-domain-events
Doctrine2 ORM 的扩展,允许使用领域事件并在其监听器中执行刷新操作。
Requires
- php: ^7.0
- doctrine/orm: ^2.5
- vanio/stdlib: ~0.1@dev
- vanio/type-parser: ^0.1@dev
Requires (Dev)
- doctrine/orm: ^2.5@dev
- phpunit/phpunit: ^6.5.14
- symfony/config: ^3.0
- symfony/dependency-injection: ^3.4.26
- symfony/http-foundation: ^3.4.35
- symfony/http-kernel: ^3.0
- vanio/coding-standards: ^0.2@dev
This package is auto-updated.
Last update: 2024-09-06 11:08:43 UTC
README
这是一个非常轻量级的 Doctrine2 ORM 扩展,允许使用领域事件,并且能够在监听器内部执行刷新操作。这个库受到了 Beberlei 的 Doctrine and Domain Events 文章 的启发。
安装
可以使用 composer 像通常一样进行安装。 composer require vanio/doctrine-domain-events
您还需要在 Doctrine 的事件管理器中注册 Vanio\DoctrineDomainEvents\DoctrineDomainEventDispatcher
的一个实例。
use Vanio\DoctrineDomainEvents\DoctrineDomainEventDispatcher; $eventManager->addSubscriber(new DoctrineDomainEventDispatcher);
使用方法
设置您的实体
首先确保您的实体实现了 Vanio\DoctrineDomainEvent
接口,并使用了 Vanio\DoctrineDomainEvent\EventProviderTrait
。
use Vanio\DoctrineDomainEvent\EventProvider; use Vanio\DoctrineDomainEvent\EventProviderTrait; class MyEntity implements EventProvider { use EventProviderTrait; }
引发领域事件
要从您的实体中引发领域事件,请使用 raise
方法。该方法期望传入一个 Vanio\DoctrineDomainEvent\DomainEvent
的实例,或者是一个表示领域事件名称的字符串(以及可选的属性数组)。如果是传入字符串,它将被转换为 DomainEvent
类的实例。如果您更喜欢创建自己的事件类,可以扩展 DomainEvent
类,但不要忘记扩展 name
方法。事件将在事务结束时分派,此时您的实体已经被刷新,所有更改都已投影到数据库中,因此您可以执行数据库查询来检查更改,也可以取消事务。由于此实现使用内置的 Doctrine 事件管理器以保持简单,因此您需要确保所有的事件名称都是全局唯一的。
use Vanio\DoctrineDomainEvent\EventProvider; use Vanio\DoctrineDomainEvent\EventProviderTrait; class Article implements EventProvider { use EventProviderTrait; const EVENT_ARTICLE_PUBLISHED = 'onArticlePublish'; // ... public function publish() { $this->raise(self::EVENT_ARTICLE_PUBLISHED, ['property' => 'value']); } }
监听领域事件
监听领域事件的方式与监听标准 Doctrine 事件相同,因为它使用的是同一个事件管理器。您需要准备一个监听器并将其注册到适当的领域事件中,或者您可以使用知道它要监听哪些事件的订阅者。有关事件系统的更多信息,请参阅 Doctrine 文档。
使用监听器监听领域事件
class Listener { public function onArticlePublish(DomainEvent $event) { // ... } } $eventManager->addListener(Article::EVENT_ARTICLE_PUBLISHED, new Listener);
使用订阅者监听领域事件
use Doctrine\Common\EventSubscriber; class Subscriber implements EventSubscriber { public function onArticlePublish(DomainEvent $event) { // ... } public function getSubscribedEvents(): array { return [Article::EVENT_ARTICLE_PUBLISHED]; } } $eventManager->addSubscriber(new Subscriber);