You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:24:52