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

Laravel商品页报错Trying to get property 'title' of non-object

问题背景

本地运行Laravel项目开发商品展示功能时,访问商品详情页抛出异常,自行排查无法定位问题根源,现将报错信息、相关代码、错误截图附后,求排查建议与解决方案。

报错详情

ErrorException
Trying to get property 'title' of non-object (View: C:\DK\Practice\Laravel\example-app\resources\views\product.blade.php)
报错调用栈:Illuminate\Foundation\Bootstrap\HandleExceptions::handleError
报错位置:C:\DK\Practice\Laravel\example-app\resources\views/product.blade.php 第9行

关联代码
  • 视图文件 product.blade.php
<x-base-layout>
    <div class="flex m-4">
        <div class="w-1/2 rounded shadow overflow-hidden">
            {{-- <img class="object-cover w-full" src="{{asset($product->image_url)}}"/> --}}
        </div>
            <div class="w-1/2 rounded bg-white ml-2 p-4 shadow relative">
                <div class="font-semibold">{{$product->title}}</div>
                <div class="text-sm text-gray-500">{{$product->short_desc}}</div>
                <div class="text-xs text-gray-500 mt-2">{{$product->long_desc}}</div>

                {{-- Seller info --}}
                <div class="mt-4">
                    <div class="text-xs font-semibold text-gray">Sold by</div>
                    <div class="text-sm text-gray-500">{{$product->user->name}}</div>
                </div>
                <div class="mt-2">
                    <div class="text-xs font-semibold text-gray">Phone number</div>
                    @auth
                        <div class="text-sm text-gray-500">{{$product->user->phone}}</div>
                    @else
                    <div class="text-sm text-gray-500">********** <a href="/login" class="text-xs text-blue-500">Login to view</a></div>
                    @endauth
                </div>
                <div class="mt-2">
                    <div class="text-xs font-semibold text-gray">Email address</div>
                    @auth
                        <div class="text-sm text-gray-500">{{$product->user->email}}</div>
                    @else
                    <div class="text-sm text-gray-500">********** <a href="/login" class="text-xs text-blue-500">Login to view</a></div>
                    @endauth
                </div>

                {{-- Product price --}}
                <div class="absolute bottom-0 right-0 m-6 rounded-full px-4 py-2 bg-green-500">
                    <div class="text-white font-fold text-sm">Rs. {{$product->price}}/-</div>
                </div>
            </div>
    </div>
</x-base-layout>
  • 控制器 ProductsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Product;
use Illuminate\Support\Facades\Auth;

class ProductsController extends Controller
{
    //fetch all products
    public function index() {
        $products=Product::all();
        return view('products')->with('products',$products);
    }

    //Fetch a product by id
    public function show($id){
        $product=Product::find($id);
        return view('product')->with('product',$product);
        dd($product);
    }
}
  • 路由文件 web.php
<?php

use App\Http\Controllers\ProductsController;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth'])->name('dashboard');

Route::get('/',[ProductsController::class,'index']);

Route::get('/product/{id}',[ProductsController::class,'show']);
错误截图

商品详情页报错界面

问题原因

报错直接原因是传入视图的$product变量不是对象(实际为null),视图第9行读取$product->title时触发错误。
具体触发逻辑:控制器中使用Product::find($id)查询数据,当访问的商品ID在数据库中不存在时,find方法会返回null,没有做任何判断就把null传给了视图,最终触发报错。
另外代码里还有两个隐藏问题:

  • return view()后面的dd($product)是无效代码,return之后的语句永远不会执行
  • 视图中直接访问$product->user没有做关联预加载,会产生N+1查询问题,且如果商品关联的卖家数据不存在,还会触发同类的非对象属性访问错误
修复方案
  1. 修改控制器show方法的查询逻辑,将find替换为findOrFail,查询不到对应商品时自动返回404响应,避免把null传到视图;同时预加载关联的用户(卖家)数据,优化查询性能
// 根据ID获取单个商品
public function show($id){
    $product = Product::with('user')->findOrFail($id);
    return view('product')->with('product', $product);
}
  1. 确认Product模型中已经定义和User模型的关联关系,打开app/Models/Product.php,添加如下关联方法:
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User;

class Product extends Model
{
    // 其他已有代码...

    /**
     * 商品所属的卖家(用户)
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
  1. (可选优化)使用Laravel路由模型绑定简化代码,修改路由和控制器方法:
    路由文件web.php修改:
Route::get('/product/{product}',[ProductsController::class,'show']);

控制器show方法修改:

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

改完之后访问不存在的商品ID会自动跳转到Laravel默认404页面,正常存在的商品可以正常读取属性,不会再报本次的错误。

内容的提问来源于stack exchange,提问作者mobile buddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:51:45