bornfreee / tactician-domain-events-bundle
用于将 Tactician Domain Events 库与 Symfony 项目集成的捆绑包
Requires
- php: >=5.5
- bornfree/tactician-doctrine-domain-events: ^0.4.0
- symfony/config: ^2.8|^3.0|^4.0|^5.0
- symfony/dependency-injection: ^2.8|^3.0|^4.0|^5.0
- symfony/http-kernel: ^2.8|^3.0|^4.0|^5.0
Requires (Dev)
- phpunit/phpunit: ^5.7
README
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 文件。