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

Laravel 5.6报错Trying to get property 'slug' of non-object求助

解决Laravel中" Trying to get property 'slug' of non-object "错误

咱们直接说核心问题:你既浪费了Laravel的路由模型绑定功能,又在控制器里写了错误的查询代码,导致最终传递给视图的$product是null,自然触发了这个报错。

问题拆解

  1. 路由模型绑定未生效:你自定义的路由/edit-product-{slug}参数名是{slug},但控制器方法参数是Product $product,Laravel没法自动把slug参数和Product模型关联;再加上你手动写查询的操作,直接破坏了自动注入的逻辑。
  2. 控制器查询逻辑错误:当你写$product = Product::where('slug', '=', $product)->first();时,这里的$product已经是路由尝试注入的模型实例(或字符串形式的slug),你把对象/字符串直接和slug字段比较,根本查不到数据,最终返回null。

修复步骤

1. 调整路由配置

修改自定义路由的参数名,让Laravel能正确触发路由模型绑定,同时给路由加上命名(因为视图里用到了route('products.update')):

Route::prefix('/account')->group(function () {
    Route::get('/products', 'AccountController@products');
    Route::get('/add-product', 'ProductController@create');
    // 将参数名改为{product},Laravel会自动根据你设置的getRouteKeyName('slug')查找对应模型
    Route::get('/edit-product-{product}', 'ProductController@edit')->name('products.edit');
    Route::put('/update-{product}', 'ProductController@update')->name('products.update');
});
Route::resource('products', 'ProductController');

2. 简化控制器代码

删掉多余的查询逻辑,直接使用Laravel自动注入的Product实例:

public function edit(Product $product) {
    // 路由模型绑定已经帮你找到了对应的Product,直接传给视图即可
    return view('products.edit')->with('product', $product);
}

public function show(Product $product) {
    return view('products.show')->with('product', $product);
}

3. 优化视图中的路由调用

因为你传递了完整的Product实例,Laravel会自动使用你设置的slug作为路由参数,同时别忘了添加Laravel表单必需的@method和@csrf:

<form role="form" method="POST" action="{{ route('products.update', $product) }}">
    @method('PUT') <!-- 伪造PUT请求方法,Laravel要求 -->
    @csrf <!-- CSRF令牌,必须添加以保证安全 -->
    
    <!-- 你的表单字段内容 -->
</form>

补充说明

为什么你之前改成$product->id还是报错?因为控制器里的错误查询已经让$product变成了null,不管调用null->slug还是null->id,都会触发"获取非对象属性"的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:23