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查询问题,且如果商品关联的卖家数据不存在,还会触发同类的非对象属性访问错误
修复方案
- 修改控制器
show方法的查询逻辑,将find替换为findOrFail,查询不到对应商品时自动返回404响应,避免把null传到视图;同时预加载关联的用户(卖家)数据,优化查询性能
// 根据ID获取单个商品 public function show($id){ $product = Product::with('user')->findOrFail($id); return view('product')->with('product', $product); }
- 确认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); } }
- (可选优化)使用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
相关产品推荐
相关产品推荐

