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
相关产品推荐
相关产品推荐

