Laravel 11事件广播出现双重序列化问题,求解决方法
Laravel Reverb 事件data字段双重序列化问题解决
问题描述
使用Laravel Reverb通过WebSocket分发SeatUpdatedEvent事件时,JSON响应中的data字段出现双重序列化情况,即使更换broadcastWith()方法的负载类型也无法解决。
事件代码
<?php namespace App\Events; use App\Models\Seat; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class SeatUpdatedEvent implements ShouldBroadcast { use Dispatchable, InteractsWithSockets, SerializesModels; public function __construct( public Seat $seat ) { } /** * Get the channels the event should broadcast on. * * @return array<int, \Illuminate\Broadcasting\Channel> */ public function broadcastOn(): array { return [ new Channel('show-'.$this->seat->show_id), ]; } public function broadcastAs(): string { return 'seat.updated'; } public function broadcastWith() { return ['test' => 'Hello World!']; } }
异常响应示例
{ "event": "seat.updated", "data": "{\"test\":\"Hello World!\"}", "channel": "show-9bec219c-927f-4d28-ac91-79e9a167489f" }
解决方案
方案1:移除SerializesModels trait
由于broadcastWith()已经手动返回数组格式的负载,不需要SerializesModels trait自动处理模型序列化。移除该trait后,Reverb会直接使用返回的数组作为data字段值,避免二次序列化:
修改后的事件类核心代码:
class SeatUpdatedEvent implements ShouldBroadcast { use Dispatchable, InteractsWithSockets; // 移除SerializesModels // 其余方法保持不变 }
方案2:配置Reverb使用数组序列化模式
在config/broadcasting.php的Reverb配置项中添加'serialize' => 'array',强制Reverb将事件数据以数组形式处理,避免重复序列化:
'reverb' => [ 'driver' => 'reverb', 'key' => env('REVERB_APP_KEY'), 'secret' => env('REVERB_APP_SECRET'), 'app_id' => env('REVERB_APP_ID'), 'options' => [ 'host' => env('REVERB_HOST', 'localhost'), 'port' => env('REVERB_PORT', 8080), 'scheme' => env('REVERB_SCHEME', 'http'), 'path' => env('REVERB_PATH', '/'), ], 'client_options' => [ // Guzzle客户端配置 ], 'serialize' => 'array', // 添加此配置 ],
内容的提问来源于stack exchange,提问作者ssada
相关产品推荐
相关产品推荐

