Symfony Messenger 如何确定哪个处理程序应该处理每种类型的消息?

How does Symfony Messenger determine which handler should handle each type of message?

我正在尝试使用 Messenger 组件在 rabbit 和 Symfony 中实现交换。

假设我们有一个交通工具:

messenger:
    transports:
        amqp_image_resize:
            dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
            options:
                exchange:
                    name: image_resize_ex
                    type: fanout
                queue:
                    name: image_resize_qu

    routing:
         'App\MessageBus\Message\Image\Resize': amqp_image_resize

消费者如何知道应该使用哪个处理程序来处理消息?

首先,处理程序 class 应该实现 Symfony\Component\Messenger\Handler\MessageHandlerInterface

这允许 Symfony 使用适当的标签自动配置服务。

那么您的处理程序应该使用它能够处理的消息类型进行类型提示。在你的情况下,是这样的:

namespace App\MessageBus\Handler;

use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use App\MessageBus\Message\Image\Resize;

class ResizeHandler implements MessageHandlerInterface {

   public function __invoke(Resize $message) {

      // do your thing
   }

}

接口加上参数 type-hint 允许 Symfony 决定哪个处理程序应该处理这个消息。

这显示在文档中 here