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

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());
        });
    }
}

错误原因分析

  1. 控制器判断逻辑错误:readCategory方法中用if($gmcategories)判断是否存在分类,但Gmcategories::all()返回的永远是集合对象(即使为空),导致条件永远成立,错误执行后续代码。
  2. 商品查询参数错误:用集合$gmcategories->id作为查询条件,集合本身没有id属性,触发的错误会干扰视图渲染流程,导致header中的变量处理异常。
  3. 冗余代码干扰:方法末尾多余的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:20:31