Symfony Notifier 官方支持 Slack、Microsoft Teams 和 Telegram 三类聊天通道,需分别安装对应包并配置 DSN;微信等未内置,须自定义 Transport。

Symfony 本身不内置“聊天通知”功能,它没有原生的微信、钉钉或企业微信通道。所谓“聊天通知”,在 Symfony Notifier 中实际指代的是 ChatChannel 及其对接的第三方聊天服务(如 Slack、Microsoft Teams、Telegram),需通过对应 Transport 扩展实现。
哪些聊天渠道能直接用?
官方支持且开箱即用的聊天类通道包括:
-
Slack:需安装
symfony/slack-notifier,DSN 格式为slack://token@default?channel=general -
Microsoft Teams:需安装
symfony/teams-notifier,DSN 为teams://webhook@default(Webhook URL 填入 token) -
Telegram:需安装
symfony/telegram-notifier,DSN 形如telegram://bot-token@default?chat-id=123456789
注意:不是所有“聊天”都叫 ChatChannel——例如微信公众号、企业微信、飞书等未被 Symfony 官方内置,必须自行实现 Transport 或借助第三方 Bundle(如 php-telegram-bot/telegram-bot-api 封装后集成)。
怎么配才能让聊天消息发出去?
三步缺一不可:
- 装包:
composer require symfony/slack-notifier(以 Slack 为例) - 配 DSN:
SLACK_DSN=slack://xoxb-xxx@default?channel=%env(SLACK_CHANNEL)%(推荐放 .env) - 启用通道:在
config/packages/notifier.yaml中确保channels: ['chat']已启用,或显式声明chat: ['slack']
常见静默失败原因:漏写 channels 配置、环境变量名拼错(如 SLACK_TOKEN 写成 SLACK_API_TOKEN)、Webhook URL 权限未开通(Teams/Slack 后台未添加应用)。
Notification 和 Recipient 怎么写才走聊天通道?
Notifier 不会自动猜你想发给谁——必须明确告诉它该走哪个 channel,并提供对应联系方式:
- Notification 类中
getChannels(RecipientInterface $recipient)应返回['chat'](或具体如['slack']) - Recipient 类必须实现
getChatName()(Slack/Teams 用)或getChatId()(Telegram 用),哪怕只是返回硬编码字符串 - 别用数组或字符串当 recipient;必须实现
RecipientInterface,否则 Notifier 直接跳过
示例:$notifier->send($notification, new SlackUser('dev-team')),其中 SlackUser::getChatName() 返回 'dev-team',匹配 Slack 中的频道名。
为什么测试时收不到消息但也不报错?
这是聊天通道最典型的“假成功”现象:
- Transport 层调用 Webhook 失败时,默认行为是吞掉异常并记录 warning 日志(非 error),容易被忽略
- 检查日志:
grep -i slack var/log/dev.log或看 Webhook 返回状态码(404/403 表示 Token 或权限问题) - 本地开发时,确保网络可访问 Slack/Teams 服务器(部分内网环境会拦截 outbound HTTPS)
- 不要依赖
send()的返回值判断成败——它永远返回 void;真要确认,得监听NotificationSent事件或捕获TransportException


















