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,提问作者Данил Грицан
相关产品推荐
相关产品推荐

