becklyn / ddd-symfony-bridge
Symfony 桥接器,用于与 becklyn/ddd-core 和 becklyn/ddd-doctrine-bridge 一起使用
Requires
- php: >=8.0
- becklyn/ddd-core: ^4.0
- becklyn/ddd-doctrine-bridge: ^3.0.1
- doctrine/doctrine-bundle: ^1.10||^2.0
- doctrine/doctrine-migrations-bundle: ^3.0
- sensio/framework-extra-bundle: ^5.0||^6.0
- simple-bus/message-bus: ^6.0
- simple-bus/symfony-bridge: ^6.0
- symfony/config: ^5.4 || ^6.0
- symfony/dependency-injection: ^5.4 || ^6.0
- symfony/http-foundation: ^5.4 || ^6.0
Requires (Dev)
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.1
README
becklyn/ddd-symfony-bridge 将 becklyn/ddd-core 和 becklyn/ddd-doctrine-bridge 提供的组件与 Symfony 应用程序集成。它使用 SimpleBus 实现事件和命令总线。
安装
- 运行
composer require becklyn/ddd-symfony-bridge
。 - 将以下内容添加到
bundles.php
SimpleBus\SymfonyBridge\SimpleBusCommandBusBundle::class => ['all' => true], SimpleBus\SymfonyBridge\SimpleBusEventBusBundle::class => ['all' => true], Becklyn\Ddd\BecklynDddBundle::class => ['all' => true],
启用事件总线及订阅者和命令总线及处理器
- 将以下内容添加到
services.yaml
event_subscribers: namespace: App\ resource: '../src/**/*Subscriber.php' public: true tags: - { name: event_subscriber, register_public_methods: true } command_handlers: namespace: App\ resource: '../src/**/*Handler.php' public: true tags: - { name: command_handler, register_public_methods: true }
- 上述配置将所有以 'Subscriber' 结尾的类注册为事件订阅者,并将所有以 'Handler' 结尾的类注册为命令处理器。确保您的代码中没有以这些结尾的类,它们不是事件订阅者或命令处理器。
启用事件存储
- 运行
php bin/console doctrine:migrations:migrate
。这将执行 becklyn/ddd-doctrine-bridge 提供的 Doctrine 迁移,为事件存储创建数据库表。 - 如果您不希望使用事件存储,请参阅下面的
use_event_store
配置选项。 - 如果您处理枚举并且需要它们被正确序列化,请将以下内容添加到
services.yaml
# services.yaml # required for serializing event data with enums into the event store symfony_enum_normalizer: class: Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer public: false tags: [ serializer.normalizer ]
- 要将事件数据持久化到事件存储中,请将以下内容添加到
services.yaml
# services.yaml # required for serializing event data into the event store symfony_property_normalizer: class: Symfony\Component\Serializer\Normalizer\PropertyNormalizer public: false tags: [ serializer.normalizer ]
- 如果您希望 Doctrine ORM 在事件存储中将微秒作为域事件时间戳的一部分进行持久化(对于 MySQL 和 Doctrine 3 不需要),请将以下内容添加到
services.yaml
和doctrine.yaml
# services.yaml # required for microsecond serialization in event store for raisedTs datetime_normalizer: class: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer public: false tags: [serializer.normalizer] arguments: - datetime_format: 'Y-m-d H:i:s.u' # only if using Oracle oracle_connector: class: Becklyn\Ddd\DateTime\Infrastructure\Doctrine\MicrosecondsOracleSessionInit tags: - { name: doctrine.event_listener, event: postConnect } # doctrine.yaml # required for writing event raisedTs microseconds into the DB doctrine: dbal: types: datetime_immutable: Becklyn\Ddd\DateTime\Infrastructure\Doctrine\DateTimeImmutableMicrosecondsType
如何使用
使用事件订阅者和命令处理器
如果您遵循了上面的安装说明,要注册一个类作为事件订阅者或命令处理器,只需确保其类名以 'Subscriber' 或 'Handler' 结尾即可。
每个订阅者或处理器可以处理一个或多个事件或命令。单个事件类可以由多个订阅者处理,但如果命令类由多个处理器处理,应用程序将抛出异常或表现不可预测。
要使订阅者或处理器处理事件或命令,只需实现一个具有单个参数的公共方法,该参数类型为事件或命令类。方法名称和参数可以是任何名称,但方法必须返回 void。传统上,方法名称为 handle
,参数为 $event
或 $command
,或者对于处理多个不同事件或命令的订阅者或处理器,方法名称为 handleMyEventClass
。
配置
要更改配置选项的默认值,在您的 Symfony 应用程序中 config/packages
文件夹内创建一个 becklyn_ddd.yaml
文件,并包含以下内容
becklyn_ddd: option_name: value another_option_name: value
可用选项
use_event_store
- 类型:布尔值
- 默认值:true
默认情况下,事件存储是启用的。如果您出于任何原因不希望使用它,请将此选项设置为 false。
请注意,如果将此选项保留为 true,并且未执行存储所需的 Doctrine 迁移,则在提交事务并且已注册事件时,应用程序将抛出异常。
SimpleBus 配置
SimpleBus 总是在处理当前命令之前完成对当前命令的处理。换句话说,它将处理另一个命令期间分发的所有命令放入队列中,并在当前命令处理完成后才清空队列。
在许多情况下,命令调度另一个命令,并且在该原始命令处理恢复之前处理该新命令可能是一个代码问题。但是,如果您需要此类功能,可以配置 SimpleBus 来实现。请将以下内容添加到 config/packages
中的 command_bus.yaml
command_bus: middlewares: finishes_command_before_handling_next: false