Symfony通知组件需通知内容、接收者、渠道策略、传输配置四者协同;内容须用Notification类封装,接收者须实现RecipientInterface,渠道需显式启用并配DSN,ChannelPolicy决定动态路由。

Symfony通知组件不是“调个方法就发出去”,而是靠通知内容 + 接收者 + 渠道策略 + 传输配置四者协同工作。发不出、发错渠道、本地不生效,几乎都卡在这四个环节中的某一个。
通知内容要封装成 Notification 对象
不能直接传字符串或数组。必须用 Notification 类(或其子类)封装:
- 标题和内容用
new Notification('标题', $channels)初始化,$channels是建议渠道列表,比如['email', 'sms'] - 正文用
->content('…')设置;重要性用->importance(Notification::IMPORTANCE_HIGH) - 如需模板、上下文数据(如订单号、错误堆栈),应继承
Notification自定义类,而非用TextNotification
接收者必须实现 RecipientInterface
Notifier 不认邮箱字符串或手机号,只认实现了接口的对象:
- 自定义类需实现
getEmail()、getPhone()方法,哪怕返回null - Notifier 会根据渠道名自动调对应方法:要发短信就查
getPhone(),要发邮件就查getEmail() - 常见错误:传
'user@example.com'字符串进去——Notifier 直接跳过,不报错也不发
渠道必须显式启用并配好 DSN
默认只有 chat 渠道可用,邮件和短信不会自动启用:
- 邮件需装
symfony/mailer,并在notifier.yaml中配置transports: { email: 'smtp://...' } - 短信需额外安装网关包(如
symfony/twilio-notifier或symfony/aliyun-notifier),再配transports: { sms: 'twilio://...' } - 环境变量名必须严格匹配文档(如
TWILIO_AUTH_TOKEN写成TWILIO_TOKEN就静默失败)
发送逻辑依赖 ChannelPolicy 路由
Notification 里的 getChannels() 方法决定最终走哪些渠道,它应是动态的:
- 推荐写法:
return $recipient->getPhone() ? ['sms'] : ($recipient->getEmail() ? ['email'] : []); - 避免硬编码
['email', 'sms']——用户没填手机号却仍尝试发短信,会失败且无提示 - 复杂路由(如 VIP 用户双渠道、普通用户单渠道)应实现自定义
ChannelPolicy,而不是在通知类里写 if-else
不复杂但容易忽略。


















