Final Class Yiisoft\Db\Migration\Command\RedoCommand
| Inheritance | Yiisoft\Db\Migration\Command\RedoCommand » Symfony\Component\Console\Command\Command |
|---|
Redoes the last few migrations.
This command will first revert the specified migrations, and then apply them again.
For example:
./yii migrate:redo # redo the last applied migration
./yii migrate:redo --limit=3 # redo last 3 applied migrations
./yii migrate:redo --all # redo all migrations
./yii migrate:redo --path=@vendor/yiisoft/rbac-db/migrations # redo the last migration from the directory
./yii migrate:redo --namespace=Yiisoft\\Rbac\\Db\\Migrations # redo the last migration from the namespace
Public Methods
| Method | Description | Defined By |
|---|---|---|
| __construct() | Yiisoft\Db\Migration\Command\RedoCommand |
Protected Methods
| Method | Description | Defined By |
|---|---|---|
| configure() | Yiisoft\Db\Migration\Command\RedoCommand | |
| execute() | Yiisoft\Db\Migration\Command\RedoCommand |
Method Details
| public mixed __construct ( Yiisoft\Db\Migration\Service\MigrationService $migrationService, Yiisoft\Db\Migration\Migrator $migrator, Yiisoft\Db\Migration\Runner\DownRunner $downRunner, Yiisoft\Db\Migration\Runner\UpdateRunner $updateRunner ) | ||
| $migrationService | Yiisoft\Db\Migration\Service\MigrationService | |
| $migrator | Yiisoft\Db\Migration\Migrator | |
| $downRunner | Yiisoft\Db\Migration\Runner\DownRunner | |
| $updateRunner | Yiisoft\Db\Migration\Runner\UpdateRunner | |
public function __construct(
private readonly MigrationService $migrationService,
private readonly Migrator $migrator,
private readonly DownRunner $downRunner,
private readonly UpdateRunner $updateRunner,
) {
parent::__construct();
}
| protected void configure ( ) |
protected function configure(): void
{
$this
->addOption('limit', 'l', InputOption::VALUE_REQUIRED, 'Number of migrations to redo.', 1)
->addOption('all', 'a', InputOption::VALUE_NONE, 'Redo all migrations.')
->addOption('path', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Path to migrations to redo.')
->addOption('namespace', 'ns', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Namespace of migrations to redo.')
->addOption('force-yes', 'y', InputOption::VALUE_NONE, 'Force yes to all questions.');
}
| protected integer execute ( \Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output ) | ||
| $input | \Symfony\Component\Console\Input\InputInterface | |
| $output | \Symfony\Component\Console\Output\OutputInterface | |
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$this->migrator->setIo($io);
$this->migrationService->setIo($io);
$this->downRunner->setIo($io);
$this->updateRunner->setIo($io);
$this->migrationService->before($this->getName() ?? '');
$limit = !$input->getOption('all')
? (int) $input->getOption('limit')
: null;
if ($limit !== null && $limit <= 0) {
$io->error('The limit option must be greater than 0.');
$this->migrationService->databaseConnection();
return Command::INVALID;
}
/** @var string[] $paths */
$paths = $input->getOption('path');
/** @var string[] $namespaces */
$namespaces = $input->getOption('namespace');
if (!empty($paths) || !empty($namespaces)) {
$migrations = $this->migrator->getHistory();
$migrations = array_keys($migrations);
$migrations = $this->migrationService->filterMigrations($migrations, $namespaces, $paths);
if (empty($migrations)) {
$io->warning('No applied migrations found.');
return Command::FAILURE;
}
if ($limit !== null) {
$migrations = array_slice($migrations, 0, $limit);
}
} else {
$migrations = $this->migrator->getHistory($limit);
if (empty($migrations)) {
$io->warning('No migration has been done before.');
return Command::FAILURE;
}
$migrations = array_keys($migrations);
}
$countMigrations = count($migrations);
$migrationWord = $countMigrations === 1 ? 'migration' : 'migrations';
$output->writeln("<warning>Total $countMigrations $migrationWord to be redone:</warning>\n");
foreach ($migrations as $i => $migration) {
$output->writeln("\t<info>" . ($i + 1) . ". $migration</info>");
}
if ($this->confirm($input, $output, $migrationWord)) {
$instances = $this->migrationService->makeRevertibleMigrations($migrations);
$migrationWas = ($countMigrations === 1 ? 'migration was' : 'migrations were');
foreach ($instances as $i => $instance) {
try {
$this->downRunner->run($instance, $i + 1);
} catch (Throwable $e) {
$output->writeln("\n<fg=yellow> >>> Total $i out of $countMigrations $migrationWas reverted.</>\n");
$io->error($i > 0 ? 'Partially reverted.' : 'Not reverted.');
throw $e;
}
}
foreach (array_reverse($instances) as $i => $instance) {
try {
$this->updateRunner->run($instance, $countMigrations - $i);
} catch (Throwable $e) {
$output->writeln("\n<fg=yellow> >>> Total $i out of $countMigrations $migrationWas applied.</>\n");
$io->error($i > 0 ? 'Reverted but partially applied.' : 'Reverted but not applied.');
throw $e;
}
}
$output->writeln("\n<info> >>> $countMigrations $migrationWas redone.</info>\n");
$io->success('Migration redone successfully.');
}
$this->migrationService->databaseConnection();
return Command::SUCCESS;
}
Signup or Login in order to comment.