Laravel:如何修改migrate:rollback命令支持直接传入文件夹参数?
实现自定义迁移回滚命令的方法
1. 创建自定义命令类
在app/Console/Commands目录下新建CustomMigrateRollback.php,代码如下:
<?php namespace App\Console\Commands; use Illuminate\Database\Console\Migrations\RollbackCommand; use Symfony\Component\Console\Input\InputArgument; class CustomMigrateRollback extends RollbackCommand { protected $signature = 'migrate:rollback {folder : 迁移文件夹名称} {--step=1 : 回滚步数} {--database= : 指定数据库连接}'; protected $description = '回滚指定文件夹下的数据库迁移'; public function handle() { // 读取传入的文件夹参数,拼接完整路径 $folder = $this->argument('folder'); $path = database_path("migrations/{$folder}"); // 给命令设置path选项,复用原命令的逻辑 $this->input->setOption('path', $path); // 调用父类的回滚逻辑 return parent::handle(); } protected function getArguments() { // 新增folder必填参数 return array_merge(parent::getArguments(), [ ['folder', InputArgument::REQUIRED, '迁移文件所在的子文件夹'], ]); } }
2. 替换原命令
打开app/Providers/AppServiceProvider.php,在register方法中添加替换逻辑,让Laravel用自定义命令替代原生的migrate:rollback:
<?php namespace App\Providers; use App\Console\Commands\CustomMigrateRollback; use Illuminate\Database\Console\Migrations\RollbackCommand; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function register() { $this->app->extend(RollbackCommand::class, function ($originalCommand, $app) { return new CustomMigrateRollback($app['migrator']); }); } public function boot() { // 其他启动逻辑 } }
3. 测试使用
现在可以直接用简化后的命令回滚指定文件夹的迁移:
# 基础用法,回滚admin文件夹下的最后1次迁移 php artisan migrate:rollback admin # 回滚2步 php artisan migrate:rollback admin --step=2 # 指定数据库连接回滚 php artisan migrate:rollback admin --database=secondary_db
该方案完全复用Laravel原生迁移回滚的所有逻辑,仅新增参数解析和路径自动拼接功能,不会破坏原有命令的其他特性。
内容的提问来源于stack exchange,提问作者Elisaveta
相关产品推荐
相关产品推荐

