chatter组件不支持飞书,需用feishuchatnotifier(v6.2+内置),配置dsn为feishu://webhook-url,发送须通过notification路由至feishu通道,不可直接调用chatter::send()。

Chatter 组件不支持飞书,得换用 Chat Notifier
Symfony Notifier 的 Chatter 接口只负责「发送消息到聊天通道」,但它本身不包含飞书(Feishu)实现。飞书属于 ChatNotifier 类型,必须用 FeishuChatNotifier —— 这个类在 symfony/notifier v6.2+ 才内置,低版本需手动注册或升级。
常见错误是照着 Slack 或 Telegram 的配置硬套飞书 webhook,结果发不出消息,日志里只显示 Failed to notify: No notifier supports this chat message。
- 确认 Symfony 版本 ≥ 6.2:
composer show symfony/notifier - 飞书机器人必须开启「群机器人」并复制「Webhook URL」(形如
https://open.feishu.cn/open-apis/bot/v2/hook/xxx),不是自建应用的 API 地址 -
ChatterInterface实例不能直接 newFeishuChatNotifier,它需要HttpClientInterface和配置项,应走服务容器注入
配置飞书 Webhook 并启用 FeishuChatNotifier
在 config/packages/notifier.yaml 中声明飞书通道,并绑定到 chat 类型:
notifier:
# 必须启用 chat 通道
chat:
- feishu
<pre class="brush:php;toolbar:false;"># 飞书 webhook 地址(从飞书后台复制)
dsn: 'feishu://your-webhook-url'
注意:dsn 必须以 feishu:// 开头,且不能带 query 参数(飞书不支持签名验证等额外参数)。如果 DSN 写成 https://... 或漏掉协议头,FeishuChatNotifier 根本不会被加载。
- 多个飞书机器人?用不同 DSN,比如
feishu://webhook-a和feishu://webhook-b,再通过notifier.channel_priority或手动指定 channel 使用 - 开发环境想禁用?设置
notifier.chatter_transports为空数组,或用when@dev条件覆盖 DSN - 飞书要求消息体为 JSON,
FeishuChatNotifier默认发的是text类型;如需富文本(加粗、链接),得传FeishuMessage实例,不是普通ChatMessage
发报警消息时别用 Chatter::send(),改用 Notification + Notifier
直接调 $chatter->send() 会失败,因为 Chatter 不认识飞书。正确路径是:构造 Notification,让它自动路由到 FeishuChatNotifier。
$notification = new Notification('服务器 CPU 超过 90%', ['feishu']);
$notification->content('节点:web-01,时间:' . date('Y-m-d H:i:s'));
<p>$notifier->send($notification);</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2470" title="飞书(Windows)"><img
src="https://img.php.cn/upload/manual/001/503/042/6a5988a4389f9477.png" alt="飞书(Windows)" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2470" title="飞书(Windows)" class="overflowclass">飞书(Windows)</a>
<p class="overflowclass">飞书最新版全局新增 HTML 文件预览,云盘 / 会话 / 文档内上传的.html 文件可切换**预览视图 / 代码视图**,无需下载即可查看页面渲染效果;多维表格配套优化 AI 交互响应速度,仪表盘图表加载、批量数据运算性能大幅提升;全端消息、文档、多维表格滚动卡顿修复,大数据表千行数据筛选不卡顿;会议、审批、知识库同步小幅体验优化,AI 助手问答准确率提升。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2470" title="飞书(Windows)" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
关键点在于 ['feishu'] 这个 channel 数组 —— 它触发 Notifier 查找所有支持该 channel 的 notifier,其中就包括 FeishuChatNotifier。如果写成 ['chat'] 或空数组,Symfony 会 fallback 到默认 transport(通常是 email),飞书收不到。
- 消息内容超过飞书限制(2000 字符)?
FeishuChatNotifier会静默截断,不抛异常,建议提前mb_strcut() - 想发卡片消息(Card)?必须用
FeishuMessage:(new FeishuMessage())->card(...),然后传给$notifier->send() - 异步发送?确保你配了
asynctransport(如 messenger),否则 HTTP 请求会阻塞主流程
调试飞书发送失败:看日志和响应体
飞书返回 400 或 412 错误时,FeishuChatNotifier 默认只记录 Failed to notify,不暴露具体原因。要定位问题,得开 debug 日志或临时 patch 发送逻辑。
最有效办法:在 FeishuChatNotifier::doNotify() 里加 dump($response->getContent())(仅开发),飞书错误体通常是 JSON,例如:
{"code":20001,"msg":"invalid webhook url"}
常见响应码含义:
-
400:JSON 格式错(比如多逗号)、字段名拼错(飞书认msg_type,不是type) -
412:机器人被禁用或 webhook 失效(飞书后台关闭/重置过) -
429:1 分钟内超 20 条(飞书限频),别在循环里发报警 - 空响应体?检查是否开了飞书机器人的「IP 白名单」,而你的服务器 IP 没加进去
飞书对请求头、body encoding、HTTP method 很敏感,任何改动都可能让通知无声失败 —— 它不像 Slack 那样宽容。










