Laravel报错Trying to get property 'slug' of non-object求助
问题:点击分类链接时出现“Trying to get property 'slug' of non-object”错误
在实现前端通过URL/slug按分类展示商品功能时,点击分类链接触发以下错误:
ErrorException Trying to get property 'slug' of non-object(视图路径:D:\xampp\htdocs\e-catalog\resources\views\frontend\layouts\header.blade.php)
相关代码片段
header.blade.php
<li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="/goldmart" role="button" data-bs-toggle="dropdown" aria-expanded="false">Goldmart</a> <ul class="dropdown-menu"> @foreach ($gmcategories as $gmc ) <li><a class="dropdown-item" href="{{url('goldmart/'.$gmc->slug)}}">{{$gmc->category_name}}</a></li> @endforeach </ul> </li>
web.php
Route::get('/goldmart', 'GoldmartController@index'); Route::get('/goldmart/{slug}', 'GoldmartController@readCategory');
GoldmartController.php
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Gmproducts; use App\Gmcategories; class GoldmartController extends Controller { public function index() { $gmproducts = Gmproducts::orderBy('id', 'desc')->get(); $gmcategories = Gmcategories::all(); return view('frontend.pages.goldmart', compact('gmproducts', 'gmcategories')); } public function readCategory($slug) { $category = Gmcategories::where('slug', $slug)->first(); $gmcategories = Gmcategories::all(); if($gmcategories) { $gmproducts = Gmproducts::where('category_id', $gmcategories->id)->get(); return view('frontend.pages.goldmart', compact('gmproducts', 'category', 'gmcategories')); } else { return redirect('/'); } return view('frontend.pages.goldmart'); } }
AppServiceProvider.php
namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\View; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // 自定义货币格式化指令 Blade::directive('currency', function ($expression) { return "Rp<?php echo number_format($expression,2,',','.'); ?>"; }); View::composer('frontend.layouts.header', function ($view) { $view->with('gmcategories', Gmcategories::all()); }); } }
错误原因分析
- 控制器判断逻辑错误:
readCategory方法中用if($gmcategories)判断是否存在分类,但Gmcategories::all()返回的永远是集合对象(即使为空),导致条件永远成立,错误执行后续代码。 - 商品查询参数错误:用集合
$gmcategories->id作为查询条件,集合本身没有id属性,触发的错误会干扰视图渲染流程,导致header中的变量处理异常。 - 冗余代码干扰:方法末尾多余的
return view语句无意义,可能打断正常流程。
修复方案
步骤1:修正GoldmartController的readCategory方法
将方法修改为:
public function readCategory($slug) { $category = Gmcategories::where('slug', $slug)->first(); $gmcategories = Gmcategories::all(); // 判断当前点击的分类是否存在 if($category) { // 根据当前分类ID查询对应商品 $gmproducts = Gmproducts::where('category_id', $category->id)->get(); return view('frontend.pages.goldmart', compact('gmproducts', 'category', 'gmcategories')); } else { // 分类不存在时重定向到首页 return redirect('/'); } }
步骤2:(可选)添加防御性判断
在header.blade.php的循环中增加非空判断,避免潜在的对象为空问题:
@foreach ($gmcategories as $gmc ) @if($gmc) <li><a class="dropdown-item" href="{{url('goldmart/'.$gmc->slug)}}">{{$gmc->category_name}}</a></li> @endif @endforeach
步骤3:检查数据库数据
确保Gmcategories表中所有分类的slug字段都有有效值,无空记录或无效数据。
内容的提问来源于stack exchange,提问作者My Buzynis
相关产品推荐
相关产品推荐

