rva-vzw/krakboem-bundle

rva-vzw/krakboem 的 Symfony messenger 实现

安装: 152

依赖项: 0

建议者: 0

安全: 0

星标: 0

分支: 0

类型:symfony-bundle

v0.1.2 2024-01-11 21:29 UTC

This package is not auto-updated.

Last update: 2024-09-19 23:55:31 UTC


README

我尝试创建一个用于 rva-vzw/krakboem 的 Symfony bundle

(c) Johan Vervloet 2023, 2024

许可协议为 AGPL v3 或更高版本,详见 AGPL v3 许可协议

本 bundle 尝试提供我在 rva-vzw/krakboem 中创建的事件源接口的 Symfony 实现。

我使用 symfony messenger 用于消息总线,并使用 doctrine 用于事件存储。(这或许不是最优解。但至少目前可以这样做。)我还尝试将规范化移动到 bundle 中,但尚未成功(也许还未?)

如果您安装此 bundle,它将为您设置服务容器。但由于我尚未找到如何在 bundle 中配置 doctrine 和 messenger 的方法,因此这需要手动完成。

关于此(实验性)bundle 的文档很少。但您可以查看以下项目如何使用它:

  • dikdikdik,我著名的用于追踪 独奏惠斯特 卡牌游戏的分数的应用程序。
  • wdebelek,一个用于玩卡牌游戏的 Web 应用程序。我们在疫情期间使用了它。
  • 1jg,另一个分数应用程序。

安装说明

composer require rva-vzw/krakboem-bundle

配置

messenger

消息总线的配置

# config/packages/messenger.yaml

framework:
  messenger:
    default_bus: messenger.bus.commands
    buses:
      messenger.bus.events:
        default_middleware: allow_no_handlers
        middleware:
          - 'RvaVzw\KrakBoemBundle\Messenger\EventStoreMiddleware'
      messenger.bus.commands:
      messenger.bus.replay:
        default_middleware: allow_no_handlers

您还需要标记您的监听器,以便正确的消息总线处理正确的消息

# config/services.yaml:

services:
  _instanceof:
    RvaVzw\KrakBoem\EventSourcing\EventListener\EventListener:
      tags: [{ name: messenger.message_handler, bus: messenger.bus.events }]
    RvaVzw\KrakBoem\EventSourcing\Replay\Replayable:
      tags: [{ name: messenger.message_handler, bus: messenger.bus.replay }]
    RvaVzw\KrakBoem\Cqrs\CommandBus\CommandHandler:
      tags: [{ name: messenger.message_handler, bus: messenger.bus.commands }]

doctrine

关于 doctrine,我通常配置两个实体管理器:一个用于事件存储,另一个用于读取模型。这是我为 krakboem 使用的配置。

# config/packages/doctrine.yaml:

doctrine:
  dbal:
    url: '%env(resolve:DATABASE_URL)%'

    # IMPORTANT: You MUST configure your server version,
    # either here or in the DATABASE_URL env var (see .env file)
    #server_version: '15'
  orm:
    auto_generate_proxy_classes: true
    default_entity_manager: read_model
    proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies'
    entity_managers:
      read_model:
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        connection: default
        mappings:
          ReadModel:
            is_bundle: false
            dir: '%kernel.project_dir%/src/Infrastructure/ReadModel'
            prefix: 'App\Infrastructure\ReadModel'
            alias: ReadModel
      event_store:
        naming_strategy: doctrine.orm.naming_strategy.underscore
        connection: default
        mappings:
          EventStore:
            is_bundle: false
            type: attribute
            dir: '%kernel.project_dir%/vendor/rva-vzw/krakboem-bundle/src/Doctrine'
            prefix: 'RvaVzw\KrakBoemBundle\Doctrine'
            alias: EventStore