我需要有多个总线在我的应用程序写在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" ]想澄清之前我只有命令总线和外部总线,一切都很好,但是在我添加域和应用程序总线之后,有些地方出错了。
在测试中,我使用ExternalEventBus测试外部事件是否正确处理,如下所示:
$this->eventBus = self::$container->get(PlatformEventBus::class);
$this->eventBus->dispatch(new SomeExternalEvent());我的错误就像
Symfony\Component\Messenger\Exception\NoHandlerForMessageException: No handler for message "SomeExternalEvent".但是,当我为dev和test env运行bin/console debug:messenger时,我可以看到所有事件与它们的处理程序之间的正确映射。
但是,当我调试时,它可以看到,由于某种原因,该HandlersLocator::getHandlers()返回与命令总线相关的处理程序列表,而不是外部事件总线(可能是因为命令总线设置为默认总线)。
我知道这是有点难以解释和显示主题,但我已经花了一整天的时间,以找出它的问题。感谢任何帮助,谢谢!
对不起,对于任何类型的键入,本例中我更改了类的名称,并可能做了一些键入
发布于 2021-07-31 12:54:26
好的,我知道了,当您注入MessageBusInterface时,使用autowiryng的信使取决于变量名,所以对于外部事件总线,它应该是$externalEventBus,对于其他总线也应该是相同的。但我不明白它以前是如何工作的,正如我刚才提到的,我有一段时间的命令和外部总线,只有当我增加更多的总线时,它才停止工作。
https://stackoverflow.com/questions/68601753
复制相似问题