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

Laravel注册接口报错:Call to a member function createToken() on null

问题排查与解决步骤

1. 验证Sanctum的安装与配置是否完整

  • 检查Composer依赖:执行composer show laravel/sanctum,确认包已安装
  • 发布配置文件:运行php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
  • 执行迁移:php artisan migrate,确保personal_access_tokens表已生成
  • 确认User模型引入Sanctum trait:
    use Laravel\Sanctum\HasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable;
        // ... 其他代码
    }
    
  • 检查API Guard配置:在config/auth.php中确保api guard的driver为sanctum:
    'guards' => [
        // ... web guard配置
        'api' => [
            'driver' => 'sanctum',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
    

2. 排查signUp方法的逻辑错误

错误Call to a member function createToken() on null说明你调用该方法的变量不是有效的User实例,常见原因:

  • 用户创建失败(比如参数验证不通过、数据库字段缺失)导致User::create()返回null
  • 错误地在非User对象上调用了createToken()

正确的signUp方法示例:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Models\User;

public function signUp(Request $request)
{
    // 验证请求参数
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8|confirmed',
    ]);

    // 创建用户(确保$user不为null)
    $user = User::create([
        'name' => $validated['name'],
        'email' => $validated['email'],
        'password' => Hash::make($validated['password']),
    ]);

    // 生成令牌
    $token = $user->createToken('auth_token')->plainTextToken;

    return response()->json([
        'access_token' => $token,
        'token_type' => 'Bearer',
    ]);
}

3. 调试用户创建是否成功

在signUp方法中添加调试代码,确认$user实例是否生成:

$user = User::create(...);
dd($user); // 输出用户对象,检查是否为null

如果$user为null,检查:

  • User模型的$fillable属性是否包含创建用户时用到的字段:
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
    
  • 数据库users表是否存在对应的字段,且无必填项缺失
  • 是否有全局作用域或模型观察者拦截了用户创建操作

4. 检查路由配置

确保路由为POST请求,且正确指向控制器方法:

use App\Http\Controllers\AuthController;

Route::post('/api/v1/signup', [AuthController::class, 'signUp']);

内容的提问来源于stack exchange,提问作者Данил Грицан

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:05:02