Laravel报错Attempt to read property "name" on null 排查修复
报错根因
触发Attempt to read property "name" on null是因为控制器查询到的$user是null,视图直接取name属性就会报错,本质是没有拿到对应用户数据,常见诱因有三个:
- 自定义
logged中间件校验失效,没有拦截session无效、未登录的请求,导致请求进到控制器时session里根本没有存有效的用户ID - User模型配置有拼写错误:你写的
protected $timestamp = false;不符合Laravel Eloquent的约定,正确的属性名是public $timestamps(复数形式,属性可见性为public),如果users表没有created_at/updated_at字段,这个配置写错会直接导致ORM查询异常 - 登录写入session的逻辑有误,没有把正确的
user_id主键值存到logged键下,比如存成了空值、其他字段值
修复方案
1. 先修正User模型的配置错误
找到User模型里的时间戳配置行,替换成正确写法:
// 删除原有的 protected $timestamp = false; 替换为 public $timestamps = false;
Eloquent默认会自动操作
created_at、updated_at两个时间字段,如果表结构里没有这两个字段,必须正确配置该属性,拼写错误、可见性错误都会导致查询逻辑异常。
2. 控制器增加空值校验和兜底跳转
不要直接把查询结果传给视图,提前判断有效性,无效请求直接跳转登录页:
function profile() { $userId = session()->get('logged'); // session无用户ID直接跳登录 if (!$userId) { return redirect()->route('login')->with('msg', '请先登录账号'); } // 主键是user_id,用find查询更简洁 $user = User::find($userId); // 对应用户不存在说明session无效,清除后跳登录 if (!$user) { session()->forget('logged'); return redirect()->route('login')->with('msg', '登录状态已失效,请重新登录'); } return view('premium.profile')->with('user', $user); }
3. 视图层增加双重防护(可选)
就算控制器做了校验,视图层也可以加判断避免极端场景下的报错:
<h1>Profile</h1> @isset($user) <h2>Welcome Mr/Ms {{$user->name}}</h2> @else <h2>用户信息异常,请<a href="{{route('login')}}">重新登录</a></h2> @endisset <a href="{{route('logout')}}">Logout</a>
4. 排查中间件和登录逻辑
- 确认登录成功时,确实把当前登录用户的
user_id主键值写入session:session()->put('logged', $user->user_id) - 确认
logged中间件里已经做了基础校验:如果session里没有logged值、或者查询不到对应用户,直接拦截跳转到登录页,不要放行无效请求。
内容的提问来源于stack exchange,提问作者Mehedi Hasan Talha
相关产品推荐
相关产品推荐

