Laravel搭配Sanctum+MongoDB调用createToken时报prepare() on null错误
错误原因
该报错本质是Sanctum默认的PersonalAccessToken模型仅适配MySQL等关系型数据库,继承自Laravel原生Eloquent ORM,无法适配MongoDB驱动的查询逻辑,执行令牌插入操作时无法获取正确的数据库连接实例,因此抛出Call to a member function prepare() on null错误。
解决方案
1. 自定义适配MongoDB的PersonalAccessToken模型
新建app/Models/PersonalAccessToken.php文件,代码如下:
<?php namespace App\Models; use Jenssegers\Mongodb\Eloquent\Model; use Laravel\Sanctum\Contracts\HasAbilities; class PersonalAccessToken extends Model implements HasAbilities { protected $fillable = [ 'name', 'token', 'abilities', 'last_used_at', ]; protected $casts = [ 'abilities' => 'json', 'last_used_at' => 'datetime', ]; public function tokenable() { return $this->morphTo('tokenable'); } public function can($ability): bool { $abilities = $this->abilities ?? []; return in_array('*', $abilities) || in_array($ability, $abilities); } public function cant($ability): bool { return !$this->can($ability); } }
2. 注册自定义模型到Sanctum
打开app/Providers/AuthServiceProvider.php,在boot方法中添加注册逻辑:
use Laravel\Sanctum\Sanctum; use App\Models\PersonalAccessToken; public function boot() { $this->registerPolicies(); // 告知Sanctum使用自定义的MongoDB适配模型 Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); }
3. 修正personal_access_tokens集合的迁移文件
MongoDB为无模式数据库,原关系型数据库风格的字段定义无效,替换迁移代码为:
Schema::create('personal_access_tokens', function ($collection) { $collection->unique('token'); $collection->index(['tokenable_id', 'tokenable_type']); });
其他说明
你之前尝试将name字段改为token_base_name无法解决问题,createToken方法的第一个参数是name字段的存储值,不是字段名,无需修改字段定义,改回原有配置即可。
内容的提问来源于stack exchange,提问作者Sahandi81
相关产品推荐
相关产品推荐

