用户资料编辑表单报错Trying to get property of non-object 求解决
解决Laravel表单中「Trying to get property of non-object」报错
嘿,这个问题我之前做用户资料编辑功能时也踩过坑!本质原因很简单:$user变量有时候不是一个Eloquent对象——大概率是它变成了null(比如未登录用户访问页面、控制器没正确获取到用户),这时候你用->去访问name属性自然就会报错。
下面给你几个实用的解决办法,按推荐程度排序:
1. 结合「旧值回显」和「可选属性访问」(最推荐)
Laravel的old()函数可以在表单验证失败时保留用户输入的内容,再配合PHP 7.4+的可选属性运算符?->,完美覆盖两种场景:$user为null、表单提交失败。代码改成这样:
<input type="text" value="{{old('name', $user?->name)}}" name="name" class="form-control" id="name">
- 如果
$user存在,默认显示用户的名字; - 如果表单提交后验证失败,显示用户刚才输入的内容;
- 如果
$user是null,输入框就为空,不会报错。
2. 确保控制器中始终传递有效的User对象
从根源上解决问题,检查你的控制器代码:
- 如果是登录用户编辑自己的资料,一定要用
Auth::user()获取当前登录用户,并且加上auth中间件防止未登录用户访问:// 控制器方法 public function edit() { $user = Auth::user(); return view('user.edit', compact('user')); } // 路由要加auth中间件 Route::get('/user/edit', [UserController::class, 'edit'])->middleware('auth'); - 如果是管理员编辑其他用户,用路由模型绑定或者
findOrFail(),找不到用户直接抛出404,避免传递null:// 路由模型绑定 public function edit(User $user) { return view('user.edit', compact('user')); } // 或者用findOrFail() public function edit($id) { $user = User::findOrFail($id); return view('user.edit', compact('user')); }
3. 在模板中先判断$user是否存在
如果不想改控制器,也可以直接在Blade模板里做判断:
<div> <label for="name">Name</label> @if($user instanceof \App\Models\User) <input type="text" value="{{old('name', $user->name)}}" name="name" class="form-control" id="name"> @else <input type="text" value="{{old('name')}}" name="name" class="form-control" id="name"> @endif </div>
这种方式更直观,明确区分$user存在和不存在的情况。
为什么会出现这个报错?
再帮你梳理下常见触发场景:
- 未登录用户访问了需要登录的编辑页面,此时
$user是null; - 控制器中获取用户的逻辑有问题,比如用
User::find($id)而不是findOrFail(),当$id对应的用户不存在时返回null; - 路由没正确传递用户参数,导致控制器拿到的$user不是预期的对象。
内容的提问来源于stack exchange,提问作者johnW
相关产品推荐
相关产品推荐

