Laravel 8 使用JsonResource时触发Maximum stack depth exceeded错误
错误诱因
- 无限递归嵌套序列化:你在
OverviewResource的toArray方法中,直接用同一个OverviewResource序列化friends字段关联的用户数据。每个被序列化的朋友用户,又会触发自身OverviewResource的toArray逻辑,再次拉取自己的朋友列表并序列化,这个过程会无限循环下去,最终导致栈内存溢出,触发Maximum stack depth exceeded报错。 - 关联方法逻辑错误:你定义的
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
相关产品推荐
相关产品推荐

