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

Laravel 8 使用JsonResource时触发Maximum stack depth exceeded错误

错误诱因

  1. 无限递归嵌套序列化:你在OverviewResource的toArray方法中,直接用同一个OverviewResource序列化friends字段关联的用户数据。每个被序列化的朋友用户,又会触发自身OverviewResource的toArray逻辑,再次拉取自己的朋友列表并序列化,这个过程会无限循环下去,最终导致栈内存溢出,触发Maximum stack depth exceeded报错。
  2. 关联方法逻辑错误:你定义的getFriends是静态方法,调用时会全局查询符合条件的用户,而非返回当前序列化的用户对应的好友列表,进一步加剧了递归的量级。

修复方案

步骤1:拆分资源类,切断递归路径

单独定义一个不包含friends字段的好友基础资源类,用来序列化好友列表,避免循环嵌套:

// 新建 app/Http/Resources/FriendResource.php
class FriendResource extends JsonResource
{
    public function toArray($request): array
    {
        return [
            'first_name' => $this->first_name,
            'last_name' => $this->last_name,
            'email' => $this->email, 
            'phone' => $this->phone,
        ];
    }
}

步骤2:修正getFriends方法为实例方法

把静态方法改为普通实例方法,返回当前用户对应的好友关联数据:

// User 模型中修改
public function getFriends()
{
    // 替换为你实际的好友查询逻辑,要关联当前用户的id $this->id
    return User::where(/* 你的查询条件 */)->get();
}

步骤3:修改OverviewResource的friends字段赋值

改用拆分后的FriendResource序列化好友列表,同时调用当前模型实例的getFriends方法:

class OverviewResource extends JsonResource
{
    public function toArray($request): array
    {
        return [
            'first_name' => $this->first_name,
            'last_name' => $this->last_name,
            'email' => $this->email, 
            'phone' => $this->phone,
            'friends' => FriendResource::collection($this->getFriends()),
        ];
    }
}

可选优化:预加载好友数据

在控制器侧调用资源时预加载好友数据,避免N+1查询问题:

// 控制器调用示例
return new OverviewResource(User::findOrFail($id));

内容的提问来源于stack exchange,提问作者CoderTn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:27:04