Symfony队列协议报错:UserRegistrationEmailHandler调用参数过少问题求助
问题根因
你当前贴出的Handler代码中__invoke方法仅声明1个入参,与报错提示的「需要2个入参」不符,说明运行中的Messenger消费者进程加载的是旧版本的代码,核心原因通常是以下两类:
- 你修改过Handler代码后没有重启消费者进程:Symfony Messenger消费者启动后会将所有代码加载到内存,代码更新不会自动同步到正在运行的进程
- 错误将服务依赖写在了
__invoke方法的入参中:Messenger调用__invoke时只会传入消息对象,额外的参数会导致参数不匹配报错
解决方案
- 停止所有正在运行的Messenger消费者进程
- 清理项目缓存,执行命令:
php bin/console cache:clear
- 修正Handler的依赖注入写法,所有服务依赖(比如发邮件用到的
MailerInterface)必须放在构造函数中注入,不能放在__invoke的入参中,修正后的Handler参考代码:
<?php namespace App\Message\MessageHandler; use App\Message\UserRegistrationEmail; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; use Symfony\Component\Mime\Email; class UserRegistrationEmailHandler implements MessageHandlerInterface { public function __construct( private MailerInterface $mailer ){} /** * @param UserRegistrationEmail $registrationEmail */ public function __invoke(UserRegistrationEmail $registrationEmail){ // 测试逻辑保留,发邮件逻辑可以后续替换 sleep(15); echo '正在向 '. $registrationEmail->getUserEmail() .' 发送注册邮件'; // 实际发邮件逻辑示例 /*$email = (new Email()) ->from('系统通知邮箱地址') ->to($registrationEmail->getUserEmail()) ->subject('注册成功通知') ->text('恭喜您完成注册,欢迎使用我们的服务。'); $this->mailer->send($email);*/ } }
- 重新启动消费者进程,测试队列执行:
php bin/console messenger:consume async -vv
内容的提问来源于stack exchange,提问作者Vortex666
相关产品推荐
相关产品推荐

