使用Passport包出现Call to a member function createToken() on null错误的原因
解决Passport中
Call to a member function createToken() on null错误 这个错误的核心原因是调用createToken()方法的$users变量为null——虽然你的代码里写了if($users)的判断,但实际运行时还是出现了空对象调用方法的情况,下面是几种最可能的诱因:
1. 密码查询逻辑错误(最常见)
Laravel默认会对用户密码做哈希存储(比如用Hash::make()生成密文),但你的代码直接用明文的$password去数据库做精确匹配:
where('Password' , $password)
这种情况下,数据库里的哈希密码和明文完全不匹配,导致查询不到用户,$users自然变成null。如果你的测试环境曾用明文存密码,后来改成哈希存储却没同步修改查询逻辑,就容易出现这种看似矛盾的错误。
2. 其他查询条件不匹配
- 邮箱大小写问题:数据库里的邮箱是
user@example.com,但传入的$username是USER@EXAMPLE.COM,而你的数据库字段没设置大小写不敏感查询,导致匹配失败。 - 状态配置值错误:
config('global.active')返回的数值/字符串,和数据库UserStatus字段的有效值不匹配(比如配置是1,但数据库存的是'active'),过滤后没有符合条件的用户。
3. 代码逻辑的隐性问题
虽然你写了if($users),但可能存在变量名拼写错误(比如不小心写成if($user)),或者在if判断前有其他代码意外修改了$users的值,导致它变成null。
对应的解决办法
- 修复密码验证逻辑:不要直接用密码查数据库,先通过邮箱找到用户,再用
Hash::check()验证密码:
$users = Users::where('Email', $username)->where('UserStatus', config('global.active'))->first(); if($users && Hash::check($password, $users->Password)) { $success['token'] = $users->createToken('MyApp')->accessToken; return response()->json(['success' => $success], $this->successStatus); } else { return response()->json(['error' => 'Invalid credentials']); }
- 校准查询条件:
- 确认
config('global.active')的返回值和数据库UserStatus字段的有效值一致; - 如果需要邮箱大小写不敏感查询,可以改成
whereRaw('LOWER(Email) = ?', [strtolower($username)])(根据数据库类型调整)。
- 确认
- 检查变量与逻辑:确认
$users变量在if判断前后没有被意外修改,变量名拼写全程一致。
额外补充:确保你的Users模型已经引入Laravel\Passport\HasApiTokens trait,否则即使$users存在,也会出现Call to undefined method的错误:
use Laravel\Passport\HasApiTokens; class Users extends Model { use HasApiTokens; // ...其他代码 }
内容的提问来源于stack exchange,提问作者reza baghiee
相关产品推荐
相关产品推荐

