为何Laravel现有项目广播事件在Websockets Dashboard显示NULL?
问题背景
在现有Laravel项目中使用Laravel Websockets Dashboard捕获触发的广播事件时,返回内容为[NULL]。
对照验证:在全新安装的同版本Laravel项目中执行完全相同的操作,事件触发后Dashboard返回[](空数组),事件内容可正常展示,无异常。
当前使用的事件类RealTimeMessage.php代码如下:
namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class RealTimeMessage implements ShouldBroadcast { use SerializesModels; public $message; /** * Create a new event instance. * * @return void */ public function __construct() { $this->message = "Hello World"; } /** * Get the channels the event should broadcast on. * * @return \Illuminate\Broadcasting\Channel|array */ public function broadcastOn() { return new Channel('custom-event'); } }
现有项目出现NULL的常见原因排查
- 广播连接配置差异
对比现有项目与全新项目的config/broadcasting.php配置,重点检查pusher兼容驱动(Laravel Websockets使用的连接配置)下的参数差异,尤其是options子项的配置。如果现有项目修改过加密、集群、序列化相关的配置项,很容易导致广播生成的载荷为空。 - 广播序列化逻辑异常
事件类默认会将所有公开属性作为广播载荷输出,如果你在现有项目中全局绑定了自定义的广播序列化器,或是重写了SerializesModelstrait的相关逻辑,会直接导致序列化结果为null。可以临时在事件类中添加明确的broadcastWith方法做验证:
如果添加后事件可以正常展示,即可定位到是全局序列化逻辑的问题。public function broadcastWith() { return ['message' => $this->message]; } - 队列驱动配置不匹配
实现ShouldBroadcast接口的事件会根据队列配置异步触发广播。如果全新项目使用sync同步队列驱动,而现有项目使用了redis/database等异步队列驱动,且队列服务运行异常、队列存储的事件序列化内容损坏,就会导致推送到Websockets服务的载荷为空。可以临时将.env中的QUEUE_CONNECTION修改为sync,重启服务后测试排除队列相关问题。 - 全局中间件篡改响应内容
检查现有项目app/Http/Kernel.php中的全局中间件列表,如果存在响应内容压缩、JSON格式强制转化、权限拦截类的全局中间件,会对Websockets Dashboard接收的事件载荷进行篡改,最终输出null。 - 核心依赖版本不兼容
对比两个项目composer.json中laravel/framework、beyondcode/laravel-websockets、pusher/pusher-php-server三个包的版本,版本错配时(比如旧版Websockets包对新版Laravel的事件序列化逻辑适配不足),会直接出现事件载荷为空的问题。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

