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

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版本是正确的单资源继承类,这个点出问题的概率极低
排查步骤
  1. 先在控制器中加临时调试代码dd(Article::find(1));,访问接口看输出结果,如果输出是null,就可以100%确认是查询结果为空导致的问题,直接去数据库核对id=1的文章是否存在、是否被软删、表名和主键配置是否匹配。
  2. 如果调试输出确实是Article模型实例,再检查资源类的文件名、命名空间是否和控制器中调用的一致,避免传错类、加载了其他同名空资源类。
修复方案
  1. 控制器层替换查询方法,用findOrFail()替代find(),查询不到数据时会自动抛出404异常,不会走到资源类执行逻辑:
class ArticleController extends Controller
{
    public function index()
    {
        $article = Article::findOrFail(1);
        return new \App\Http\Resources\v1\Article($article);
    }
}
  1. 给资源类增加类型兜底判断,兼容极端情况下传入非模型数据的场景:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:45:42