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

Laravel9+PHP8.2用Passport生成令牌时出现Attempt to read property 'id' on null错误

问题分析与修复方案

1. 必须给User模型引入API令牌依赖Trait

Laravel的createToken方法依赖对应的扩展包Trait,不管你用Sanctum还是Passport,都要在User模型里添加:

use Laravel\Sanctum\HasApiTokens; // 用Sanctum就加这个,用Passport则替换为Laravel\Passport\HasApiTokens
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable; // 确保HasApiTokens在其中

    // ... 模型其他代码
}

没有这个Trait,createToken方法不存在,会触发底层错误,表现为读取null的id属性。

2. 用户创建失败导致$user为null

你当前用$request->toArray()直接传入User::create,存在两个致命问题:

  • 密码未加密,不符合Laravel用户模型的密码处理逻辑
  • 如果User模型的$fillable未包含所有需要插入的字段,批量赋值会被拦截,导致create返回null

修复步骤:

第一步:配置User模型的批量赋值白名单

在User模型中添加:

protected $fillable = [
    'first_name',
    'last_name',
    'email',
    'password',
    'phone_number',
];

第二步:手动处理密码加密,创建用户

放弃直接用request数组,改为手动赋值并加密密码:

$user = User::create([
    'first_name' => $request->first_name,
    'last_name'=> $request->last_name,
    'email' => $request->email,
    'password' => bcrypt($request->password),
    'phone_number' => $request->phone_number,
]);

3. Auth::guard('api')->check($user)用法错误

check()方法不需要参数,它的作用是检查当前请求是否有已认证用户,不是用来登录用户的。如果要在注册后自动登录,改用login():

Auth::guard('api')->login($user);

4. 增加用户创建成功校验

在生成令牌前先判断$user是否有效,避免空指针:

if (!$user) {
    return response()->json(['error' => '用户创建失败'], 500);
}

内容的提问来源于stack exchange,提问作者Romanric Akam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:35:45