不使用messenger.yml如何配置使用独立Symfony Messenger组件
接口实现误区澄清
Symfony\Component\Messenger\MessageBus 本身就是 Symfony\Component\Messenger\MessageBusInterface 的官方默认实现,你遇到的未实现接口的问题,大概率是没有导入正确的命名空间,或者未通过Composer安装对应依赖,先执行composer require symfony/messenger安装组件即可。
总线配置方案
你可以根据是否使用Symfony依赖注入组件选择对应配置方式:
1. 纯手动实例化总线
如果没有使用DI组件,直接按如下逻辑创建总线实例即可:
<?php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Handler\HandlersLocator; // 配置命令与对应处理器的映射关系 $handlersLocator = new HandlersLocator([ // 格式为 命令类名 => [处理器实例] CreateDirectionCommand::class => [new CreateDirectionHandler()], // 其余命令依次新增即可 ]); // 组装中间件栈,至少需要HandleMessageMiddleware才能完成消息分发处理 $middlewareStack = [ new HandleMessageMiddleware($handlersLocator), // 可按需新增其他中间件,比如日志、事务、验证中间件等 ]; // 实例化总线,该实例已经实现MessageBusInterface $commandBus = new MessageBus($middlewareStack); // 查询总线按相同逻辑配置,替换为查询类和对应处理器的映射即可 $queryBus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([ // 查询类与处理器映射 ])) ]);
2. 基于Symfony DI组件(services.yml)配置
你已经在使用services.yml做服务配置,直接新增如下配置即可完成总线注入:
# 1. 声明命令处理器服务 Company\Application\Handler\CreateDirectionHandler: ~ # 其余处理器依次声明即可 # 2. 配置命令总线的处理器定位器,关联命令与对应处理器 command_handlers_locator: class: Symfony\Component\Messenger\Handler\HandlersLocator arguments: $handlers: Company\Application\Command\CreateDirectionCommand: ['@Company\Application\Handler\CreateDirectionHandler'] # 其余命令依次新增即可 # 3. 配置命令总线专属的HandleMessageMiddleware command_bus.middleware.handle_message: class: Symfony\Component\Messenger\Middleware\HandleMessageMiddleware arguments: $handlersLocator: '@command_handlers_locator' # 4. 声明命令总线实例,绑定到MessageBusInterface Symfony\Component\Messenger\MessageBusInterface $commandBus: class: Symfony\Component\Messenger\MessageBus arguments: $middleware: - '@command_bus.middleware.handle_message' # 可按需新增其他中间件 # 查询总线按相同逻辑配置即可 query_handlers_locator: class: Symfony\Component\Messenger\Handler\HandlersLocator arguments: $handlers: # 你的查询类与对应处理器映射 query_bus.middleware.handle_message: class: Symfony\Component\Messenger\Middleware\HandleMessageMiddleware arguments: $handlersLocator: '@query_handlers_locator' Symfony\Component\Messenger\MessageBusInterface $queryBus: class: Symfony\Component\Messenger\MessageBus arguments: $middleware: - '@query_bus.middleware.handle_message'
注意事项
你提供的控制器代码构造函数参数缺少逗号,需要修正避免语法错误:
final class DirectionController { public function __construct( private CommandBusInterface $commandBus, // 此处补充逗号 private QueryBusInterface $queryBus ) {} // 其余逻辑保持不变 }
内容的提问来源于stack exchange,提问作者Slip
相关产品推荐
相关产品推荐

