bornfreee/tactician-domain-events-bundle

用于将 Tactician Domain Events 库与 Symfony 项目集成的捆绑包

0.5.6 2020-07-17 12:16 UTC

This package is auto-updated.

Last update: 2024-09-17 21:50:40 UTC


README

Build Status Scrutinizer Code Quality Latest Stable Version

Symfony 捆绑包,用于将 Tactician Domain Events 库 集成到 Symfony 项目中

安装

通过 composer 安装

composer require bornfreee/tactician-domain-events-bundle

将捆绑包添加到 AppKernel.php

$bundles = [
    // ...
    new \BornFree\TacticianDomainEventBundle\TacticianDomainEventBundle(),
];

配置

默认事件收集器将使用 CollectsEventsFromEntities,但有时您可能会在实体未更改时记录事件,因此事件不会被收集。当聚合根为其子实体记录事件时也是如此。要收集这些事件,您需要使用 CollectsEventsFromAllEntitiesManagedByUnitOfWork。该功能收集由工作单元管理的所有实体的所有事件。要使用它,您需要将 collect_from_all_managed_entities 设置为 true。

tactician_domain_event:
    collect_from_all_managed_entities: true # it's false on default

使用方法

此捆绑包允许您自动通过 EventDispatcher 发送领域事件。它还允许将事件监听器和订阅者作为 Symfony 服务注册。您可以针对每个领域事件注册任意数量的监听器。

首先,我们需要安装 Tactician 官方捆绑包以集成命令总线库

composer require league/tactician-bundle

然后,我们需要配置中间件以自动记录领域事件并将它们分发出去。我们只想在命令完全且成功处理之后处理事件本身。因此,我们在记录领域事件的中间件之前添加了事务中间件。

这意味着一旦事务完成,领域事件就会被记录

tactician:
    commandbus:
        default:
            middleware:
                # other middlewares...
                - tactician_domain_events.middleware.release_recorded_events # make sure to add it before `tactician.middleware.doctrine` 
                - tactician.middleware.doctrine
                - tactician.middleware.command_handler

配置事件监听器

为了为分发的领域事件添加事件监听器,我们需要定义服务和相应的命令

app.listener.send_email:
    class: AppBundle\EventListener\SendEmailAfterUserIsCreatedListener
    tags:
        - { name: tactician.event_listener, event: App\Domain\Events\UserWasCreated }

注意标签 tactician.event_listener。该捆绑包将自动找到所有带有此标签的服务,并将监听器添加到 EventDispatcher

默认情况下,事件监听器应该有公共的 __invoke 函数。如果您想有常规的方法名称,您可以在服务配置中做到这一点。

app.listener.send_email:
    class: AppBundle\EventListener\SendEmailAfterUserIsCreatedListener
    tags:
        - { name: tactician.event_listener, event: App\Domain\Events\UserWasCreated, method: send }

这就是您需要开始使用带有领域事件的 Tactician 命令总线所需的所有配置。

让我们通过创建一个新用户并触发一个 UserWasCreated 领域事件的例子来举例

class User implements ContainsRecordedEvents
{
    use EventRecorderCapabilities;

    public function __construct($name)
    {
        $this->name = $name;

        $this->record(new UserWasCreated($name));
    }

    // ...
}

一旦这个 Entity 成功创建,就会触发 SendEmailAfterUserIsCreatedListener

调试

您可以通过运行 debug:tactician-domain-events 命令来获取所有事件及其映射的监听器的列表。

许可证

版权 (c) 2017,Maks Rafalko

在 MIT 许可证下,请参阅 LICENSE 文件。