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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:57:18