首页 > 解决方案 > symfony messenger 多总线

问题描述

我需要在 Symfony 上编写的应用程序中有多个总线。为此,我正在使用信使包。

所以我需要:

所以在我的messenger.yaml我有:

framework:
    messenger:
        default_bus: command.bus
        buses:
            command.bus: ~
            domain_event.bus: ~
            application_event.bus: ~
            external_event.bus: ~
        transports:
            command_bus: '%env(COMMAND_BUS_DSN)%'
            internal_event_bus: '%env(INTERNAL_EVENT_BUS_DSN)%'
            external_event_bus: '%(EXTERNAL_EVENT_BUS_DSN)%'
        routing:
            'App\Application\CommandBus\Command': command_bus
            'App\Domain\EventBus\DomainEvent': internal_event_bus
            'App\Application\EventBus\ApplicationEvent': internal_event_bus
            'App\Infrastructure\ExternalEventBus\ExternalEvent': external_event_bus

在我的services.yaml

services:
    _defaults:
        autowire: true      
        autoconfigure: true subscribers, etc.
        public: false
    _instanceof:
        # use tags to avoid coupling handler classes to Messenger's interface
        App\Application\CommandBus\CommandHandler:
            tags: [ { name: messenger.message_handler, bus: command.bus } ]
        App\Interfaces\ExternalEventBus\ExternalEventHandler:
            tags: [ { name: messenger.message_handler, bus: external_event.bus } ]
        App\Domain\EventBus\DomainEventHandler:
            tags: [ { name: messenger.message_handler, bus: domain_event.bus } ]
        App\Application\EventBus\ApplicationEventHandler:
            tags: [ { name: messenger.message_handler, bus: application_event.bus } ]

     ... // some other services here

    App\Application\CommandBus\CommandBus:
        class: App\Infrastructure\CommandBus\CommandBus
        arguments: [ "@command.bus" ]

    App\Domain\EventBus\DomainEventBus:
        class: App\Infrastructure\DomainEventBus\DomainEventBus
        arguments: [ "@domain_event.bus" ]

    App\Application\EventBus\ApplicationEventBus:
        class: App\Infrastructure\ApplicationEventBus\ApplicationEventBus
        arguments: [ "@application_event.bus" ]

    App\Infrastructure\ExternalEventBus\ExternalEventBus:
        class: App\Infrastructure\ExternalEventBus\ExternalEventBus
        arguments: [ "@external_event.bus" ]

在我只有命令总线和外部总线之前想要澄清一切都很好,但是在我添加域和应用程序总线之后,somethinkg 出错了。

在我使用ExternalEventBus的测试中,测试外部事件是否正确处理,如下所示:

    $this->eventBus = self::$container->get(PlatformEventBus::class);
    $this->eventBus->dispatch(new SomeExternalEvent());

我收到类似的错误

Symfony\Component\Messenger\Exception\NoHandlerForMessageException: No handler for message "SomeExternalEvent".

但是当我bin/console debug:messenger同时为开发和测试环境运行时,我可以看到所有事件及其处理程序之间的正确映射。

但是当我调试它可以看到HandlersLocator::getHandlers()出于SomeExternalEvent某种原因返回与命令总线而不是外部事件总线相关的处理程序列表(可能是因为命令总线设置为默认总线)

我知道解释和展示主题有点困难,但我已经花了一整天的时间来寻找它的问题所在。任何帮助表示赞赏,谢谢!!!

抱歉有任何错别字,我在这个例子中更改了类的名称,可能有一些错别字

标签: symfonysymfony-messenger

解决方案


好的,我想通了,注入时使用 autowiryng 的信使MessageBusInterface取决于变量名称,因此对于外部事件总线,它应该$externalEventBus与其他总线相同。但我以前不明白它是如何工作的,正如我提到的,我有一段时间的命令和外部总线,只有当我添加更多总线时它才会停止工作......


推荐阅读