Laravel 5.6报错Trying to get property 'slug' of non-object求助
解决Laravel中" Trying to get property 'slug' of non-object "错误
咱们直接说核心问题:你既浪费了Laravel的路由模型绑定功能,又在控制器里写了错误的查询代码,导致最终传递给视图的$product是null,自然触发了这个报错。
问题拆解
- 路由模型绑定未生效:你自定义的路由
/edit-product-{slug}参数名是{slug},但控制器方法参数是Product $product,Laravel没法自动把slug参数和Product模型关联;再加上你手动写查询的操作,直接破坏了自动注入的逻辑。 - 控制器查询逻辑错误:当你写
$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
相关产品推荐
相关产品推荐

