Laravel Lighthouse GraphQL订阅不生效、广播无响应如何排查?
问题排查与解决步骤
1. 首要检查:Lighthouse订阅功能是否开启
你遇到的订阅类无日志、broadcast返回null、extensions中channel为null的问题,绝大多数是因为Lighthouse的订阅开关默认关闭:
- 打开
config/lighthouse.php,找到subscriptions配置项,确认enable设为true:
'subscriptions' => [ 'enable' => true, // 默认值为false,必须手动修改 // 其余配置保持默认即可 ]
- 修改后执行
php artisan config:clear清除配置缓存。
2. 修复Playground订阅端点配置
你直接配置Pusher的WS地址作为订阅端点是错误的,GraphQL Playground需要先连接你本地/线上的Lighthouse订阅端点,由Lighthouse和Pusher做后端通信,不能直连Pusher的WS接口:
- 修改
.env中的GRAPHQL_PLAYGROUND_SUBSCRIPTION_ENDPOINT为你自己的服务端点:
# 本地开发示例 GRAPHQL_PLAYGROUND_SUBSCRIPTION_ENDPOINT="ws://localhost:8000/graphql/subscriptions" # 线上HTTPS环境对应修改为wss://你的域名/graphql/subscriptions
这个配置错误直接对应你遇到的浏览器端Invalid message type报错、Pusher后台Missing parameter: event报错。
3. 开启Laravel广播服务提供者
Laravel默认关闭广播功能,需要手动开启对应的服务提供者:
- 打开
config/app.php,找到providers数组,取消App\Providers\BroadcastServiceProvider::class的注释。
4. 补充Pusher配置兼容
如果是本地开发环境,可在config/broadcasting.php的pusher配置中增加SSL忽略配置,避免证书验证失败导致广播失败:
'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'useTLS' => true, // 本地开发新增以下两项,生产环境可删除 'curl_options' => [ CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0, ], ], ],
可选验证项
如果以上步骤都执行完仍有问题,检查MessageSent订阅类的文件路径是否和命名空间对应,确认文件存放在app/GraphQL/Subscriptions/MessageSent.php位置。
内容的提问来源于stack exchange,提问作者Cata
相关产品推荐
相关产品推荐

