Laravel5.8 API报错Trying to get property of non-object
错误原因
这个报错的核心触发逻辑非常明确:你在资源类中尝试调用$this->art_title时,$this绑定的底层资源不是Article模型实例,是null这类非对象值。
结合你贴的代码,90%以上的场景是Article::find(1)没有查询到对应数据,返回了null,你把null直接传入了资源类,最终触发属性读取错误。
其他可能的触发场景:
- Article模型配置错误:比如模型绑定的数据表名不对、主键字段不是默认的
id且没有在模型中声明,导致find(1)查不到有效数据 - 模型开启了软删除功能,id=1的文章已经被软删除,默认查询条件会过滤掉这条数据
- 资源类的引入或继承错误,你贴的
use Illuminate\Http\Resources\Json\Resource;在Laravel 5.8版本是正确的单资源继承类,这个点出问题的概率极低
排查步骤
- 先在控制器中加临时调试代码
dd(Article::find(1));,访问接口看输出结果,如果输出是null,就可以100%确认是查询结果为空导致的问题,直接去数据库核对id=1的文章是否存在、是否被软删、表名和主键配置是否匹配。 - 如果调试输出确实是Article模型实例,再检查资源类的文件名、命名空间是否和控制器中调用的一致,避免传错类、加载了其他同名空资源类。
修复方案
- 控制器层替换查询方法,用
findOrFail()替代find(),查询不到数据时会自动抛出404异常,不会走到资源类执行逻辑:
class ArticleController extends Controller { public function index() { $article = Article::findOrFail(1); return new \App\Http\Resources\v1\Article($article); } }
- 给资源类增加类型兜底判断,兼容极端情况下传入非模型数据的场景:
class Article extends Resource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { if (!($this->resource instanceof \App\Article)) { return []; } return [ 'art_title' => $this->art_title, 'art_description' => $this->art_description ]; } }
注意:你贴的资源类注释写的是「Transform the resource collection into an array」,这是资源集合的注释,单资源类的注释应该对应单个资源转换,不影响代码运行,但是容易误导后续维护。
3. 核对Article模型配置:
- 如果文章表名不是默认的articles,要在模型中加protected $table = '你的实际表名';
- 如果表主键不是默认的id,要在模型中加protected $primaryKey = '你的实际主键字段名';
- 如果开启了软删除且需要查询被软删的id=1文章,查询时要加withTrashed(),比如Article::withTrashed()->findOrFail(1);
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

