Symfony Notifier组件Texter::send()返回NULL,如何获取SentMessage?
解决Symfony Notifier组件Texter::send()返回NULL无法获取SentMessage的问题
问题根源
当项目启用Messenger消息总线时,Texter::send()会将短信消息异步投递到总线队列,直接返回NULL,不会等待自定义Transport返回的SentMessage对象,导致无法直接获取发送状态。
解决方案
1. 关闭消息总线,同步发送短信
如果不需要异步发送,可以直接禁用Notifier的消息总线支持,此时Texter::send()会直接调用Transport并返回SentMessage:
# config/packages/notifier.yaml framework: notifier: messenger: false
2. 异步场景下通过自定义处理器获取结果
若必须使用异步发送,可自定义Messenger消息处理器,在处理过程中直接调用Transport获取SentMessage:
// src/MessageHandler/SmsMessageHandler.php namespace App\MessageHandler; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\TexterInterface; #[AsMessageHandler] class SmsMessageHandler { public function __construct(private TexterInterface $texter) { } public function __invoke(SmsMessage $message) { // 直接调用Transport发送,获取SentMessage对象 $sentMessage = $this->texter->send($message); // 这里可记录发送结果,比如存储到数据库或日志 // 示例:$logger->info('短信发送完成', ['msg_id' => $sentMessage->getMessageId()]); return $sentMessage; } }
注意:需保持Notifier的
messenger: true配置,处理器内部调用texter->send()时不会再次投递总线,而是直接执行发送逻辑。
3. 通过事件监听获取发送结果
Symfony Notifier在短信发送完成后会触发MessageSentEvent,监听该事件即可获取SentMessage,同步/异步场景均适用:
// src/EventListener/SmsSentListener.php namespace App\EventListener; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Notifier\Event\MessageSentEvent; class SmsSentListener implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ MessageSentEvent::class => 'onMessageSent', ]; } public function onMessageSent(MessageSentEvent $event) { $sentMessage = $event->getSentMessage(); // 处理发送结果:记录状态、更新业务数据等 // 可通过$sentMessage->getMessageId()获取服务商返回的消息ID // 可通过$sentMessage->getTransport()获取使用的Transport名称 } }
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

