直接用 composer require symfony/notifier 安装并手动配置 transport(如 SLACK_DSN、TWILIO_DSN 等),执行 php bin/console cache:clear 清缓存,启用 debug 模式排查 DSN 解析与 HTTP 响应问题。

直接用 composer require symfony/notifier 就能装好,但光装包不配置等于没装——它不会自动连 Slack、SMS 或 Mercure,必须手动配 transport 才能发出去。
怎么装 Notifier 组件才不踩坑
别用 composer require symfony/symfony(已废弃)或全局安装;Notifier 是独立组件,和 Symfony 主框架版本解耦,只要项目是 Symfony 5.4+ 或 6.x/7.x 都兼容。
-
composer require symfony/notifier是唯一推荐方式,它会自动拉取symfony/notifier和基础依赖(如symfony/messenger可选) - 如果项目里已有 Messenger,Notifier 会复用它的传输通道;没装也不影响,Notifier 自带轻量级同步发送逻辑
- 别手动生成
config/packages/notifier.yaml后忘了清缓存:php bin/console cache:clear必须执行,否则配置不生效
为什么 Slack / SMS / Mercure 都发不出去
因为 Notifier 默认不启用任何 transport,chatter_transports 和 texter_transports 都是空的,DSN 全靠环境变量注入——配错一个字符就静默失败,连错误日志都不打。
- Slack 要配
SLACK_DSN=slack://your-token@default?channel=%23general,注意 token 权限必须含chat:write,且 channel 名要 URL 编码(#general→%23general) - SMS 比如用 Twilio,DSN 格式是
twilio://ACxxx:auth_token@default?from=+1234567890,from必须是 Twilio 验证过的号码 - Mercure 要额外装桥接包:
composer require symfony/mercure-notifier,再设MERCURE_DSN=mercure://localhost:3000/.well-known/mercure,Hub 必须正在运行且允许 CORS
send() 没报错但消息没收到?检查这三处
Notifier 的 send() 方法默认是同步阻塞调用,不抛异常 ≠ 发送成功。HTTP 请求可能超时、403、429,但 Notifier 默认吞掉这些响应,只记 warning 日志。
- 开 debug 模式看真实响应:
APP_ENV=dev php bin/console notifier:transport:debug,它会列出所有 transport 状态和 DSN 是否解析成功 - 发 Slack 时用
ChatMessage,但别传空字符串或纯空格——Slack API 会拒收,返回invalid_attachments却不暴露给 PHP - 测试时别只跑 CLI:Web 请求中发通知,得确认当前环境没禁用 transport(比如
notifier.yaml里写了when@prod却在 dev 下测试)
最常被忽略的是 DSN 中的特殊字符没转义,比如 Slack token 里有 / 或 @,不 URL 编码就会截断;还有 Mercure Hub 地址末尾少了个 /,导致 .well-known/mercure 拼接失败——这种问题不会报错,只会让消息彻底消失在黑洞里。











