Laravel关联模型搭配API资源查询不存在ID时报id非对象属性错误
错误根本成因
- 核心触发逻辑:你在控制器查询相册数据时未对查询结果做非空校验,当传入不存在的相册ID时,查询方法返回
null而非GalleryName模型实例,后续代码(要么是控制器直接读属性,要么是API资源类内部隐式读取模型属性)尝试访问null的id属性时就会抛出该错误。 - 具体触发场景拆解:
- 如果你控制器中用的是
GalleryName::find($id)做查询,该方法在匹配不到记录时固定返回null,和findOrFail匹配不到直接抛404异常的逻辑不同。 - 你自定义的API资源类内部直接写了
$this->id这类读取当前模型属性的代码,当你把null传入资源类初始化后,资源类渲染数据时就会触发「尝试读取非对象的id属性」报错。
- 如果你控制器中用的是
常见错误代码示例
典型的错误控制器写法:
public function show($id) { // 匹配不到记录时$gallery为null $gallery = GalleryName::find($id); // 直接将null传入资源类 return new GalleryResource($gallery); }
规范修复方案(比临时hack方案更符合开发规范)
- 方案1:用
findOrFail替代find,匹配不到记录时自动抛出404异常,符合RESTful接口设计规范
public function show($id) { $gallery = GalleryName::findOrFail($id); return new GalleryResource($gallery); }
- 方案2:手动做非空判断,返回自定义的不存在提示
public function show($id) { $gallery = GalleryName::find($id); if (is_null($gallery)) { return response()->json(['msg' => '请求的相册不存在'], 404); } return new GalleryResource($gallery); }
内容的提问来源于stack exchange,提问作者Mahin Chowdhury
相关产品推荐
相关产品推荐

