如何配置Laravel应用使用自定义数据库目录及子目录?
如何配置Laravel使用自定义数据库迁移目录(含子目录)
方法1:运行迁移命令时指定路径
直接通过--path参数指定目标目录,比如要使用供应商(vendor)下的迁移目录:
php artisan migrate --path=vendor/你的供应商包名/database/migrations
如果目录包含子目录,加上--realpath参数保证路径解析准确:
php artisan migrate --path=vendor/你的供应商包名/database/migrations --realpath
方法2:在服务提供者中全局注册路径
在app/Providers/AppServiceProvider.php的boot方法中,添加代码扩展迁移路径,这样每次运行迁移都会自动包含这些目录:
use Illuminate\Database\Migrations\Migrator; public function boot() { $this->app->afterResolving(Migrator::class, function (Migrator $migrator) { // 添加vendor下的主迁移目录 $migrator->path(__DIR__.'/../../vendor/你的供应商包名/database/migrations'); // 按需添加子目录,多个子目录可重复调用path方法 $migrator->path(__DIR__.'/../../vendor/你的供应商包名/database/migrations/subdir1'); $migrator->path(__DIR__.'/../../vendor/你的供应商包名/database/migrations/subdir2'); }); }
方法3:重写迁移服务提供者(进阶全局替换)
如果需要彻底替换默认的迁移路径,可自定义服务提供者替代Laravel原生的:
- 创建
app/Providers/CustomMigrationServiceProvider.php,内容如下:
namespace App\Providers; use Illuminate\Database\MigrationServiceProvider as BaseServiceProvider; use Illuminate\Database\Migrations\Migrator; class CustomMigrationServiceProvider extends BaseServiceProvider { protected function registerMigrator() { $this->app->singleton('migrator', function ($app) { $repository = $app['migration.repository']; $migrator = new Migrator($repository, $app['db'], $app['files']); // 设置默认迁移路径为vendor目录 $migrator->path(__DIR__.'/../../vendor/你的供应商包名/database/migrations'); // 添加子目录 $migrator->path(__DIR__.'/../../vendor/你的供应商包名/database/migrations/subdir'); return $migrator; }); } }
- 打开
config/app.php,找到providers数组,替换原有的Illuminate\Database\MigrationServiceProvider::class为App\Providers\CustomMigrationServiceProvider::class。
额外提示
- 如果想同时保留项目默认的
database/migrations目录,只需在上述方法中额外添加$migrator->path(database_path('migrations'));即可。 - 部分供应商包会提供发布命令,可将迁移文件复制到项目默认目录,比如:
php artisan vendor:publish --provider="供应商包的服务提供者类名" --tag="migrations"
内容的提问来源于stack exchange,提问作者joels
相关产品推荐
相关产品推荐

