Laravel 10删除personal_access_tokens迁移文件后仍生成该表的疑问
问题
我用Laravel 10创建了新项目,生成了若干迁移文件。之后从迁移目录删除了项目自带的users、password_reset_tokens、failed_jobs和personal_access_tokens这几个迁移文件,但执行migrate命令创建数据库架构时,personal_access_tokens表还是被创建了。我试过清除缓存、清空数据库后重试,问题依然存在。
我找到了两个可行的解决方案:
- 在
AppServiceProvider.php的register方法中添加Sanctum::ignoreMigrations(); - 卸载Laravel自带的Sanctum包,并手动删除config目录下的
sanctum.php配置文件
我的疑惑有两个:
- 为什么删除对应迁移文件后
personal_access_tokens表仍会生成?它是如何被触发创建,又是如何获取架构细节的? - 从
composer.json中移除Sanctum依赖时,我还需要手动删除config目录下的sanctum.php文件,难道没有自动移除包所有依赖文件的机制吗?
解答
一、删除迁移文件后personal_access_tokens表仍生成的原因
Laravel Sanctum包本身自带迁移文件,这些文件并不在你的项目database/migrations目录下,而是存放在Sanctum包的内部目录(比如vendor/laravel/sanctum/database/migrations)。
执行migrate命令时,Laravel会自动加载所有已安装包中注册的迁移。Sanctum的服务提供者(SanctumServiceProvider)在启动时,已经通过loadMigrationsFrom方法注册了自身包内的迁移路径,所以哪怕你删掉项目里的迁移文件,Laravel依然会执行Sanctum自带的迁移来创建personal_access_tokens表。
表的架构细节就定义在Sanctum包内部的迁移文件里,这就是它能生成完整表结构的原因。你用的Sanctum::ignoreMigrations()方案,本质就是告诉Laravel跳过加载Sanctum的自带迁移,自然就不会生成这个表了。
二、Composer无法自动删除sanctum.php的原因
Composer只负责管理vendor目录下的依赖代码——安装时把包的代码放进vendor,卸载时删除对应目录。而config/sanctum.php是你执行php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"时,从Sanctum包内复制到项目的发布文件,这类文件属于项目的一部分,Composer无法追踪和自动删除。
原因很简单:Composer不知道你是否修改过这些文件,也不确定你是否需要保留它们。不止配置文件,像视图、语言文件这类通过vendor:publish发布到项目里的文件,卸载包时都得手动删除。
内容的提问来源于stack exchange,提问作者Ansh Bargoti

