becklyn/ddd-symfony-bridge

Symfony 桥接器,用于与 becklyn/ddd-core 和 becklyn/ddd-doctrine-bridge 一起使用

安装次数: 4,909

依赖者: 2

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

4.0.2 2022-08-31 11:54 UTC

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.yamldoctrine.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