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

使用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。


对应的解决办法

  1. 修复密码验证逻辑:不要直接用密码查数据库,先通过邮箱找到用户,再用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']);
}
  1. 校准查询条件:
    • 确认config('global.active')的返回值和数据库UserStatus字段的有效值一致;
    • 如果需要邮箱大小写不敏感查询,可以改成whereRaw('LOWER(Email) = ?', [strtolower($username)])(根据数据库类型调整)。
  2. 检查变量与逻辑:确认$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:42:27