You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:52:18