vanio/doctrine-domain-events

Doctrine2 ORM 的扩展,允许使用领域事件并在其监听器中执行刷新操作。

dev-master / 0.1.x-dev 2020-08-24 21:20 UTC

This package is auto-updated.

Last update: 2024-09-06 11:08:43 UTC


README

Build Status Coverage Status PHP7 License

这是一个非常轻量级的 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);