0 follower

Final Class Yiisoft\Yii\Cycle\Command\Migration\UpCommand

InheritanceYiisoft\Yii\Cycle\Command\Migration\UpCommand » Yiisoft\Yii\Cycle\Command\Migration\BaseMigrationCommand » Symfony\Component\Console\Command\Command

Constants

Hide inherited constants

Constant Value Description Defined By
MIGRATION_STATUS [ \Cycle\Migrations\State::STATUS_UNDEFINED => 'undefined', \Cycle\Migrations\State::STATUS_PENDING => 'pending', \Cycle\Migrations\State::STATUS_EXECUTED => 'executed', ] Yiisoft\Yii\Cycle\Command\Migration\BaseMigrationCommand

Method Details

Hide inherited methods

__construct() public method

public mixed __construct ( Yiisoft\Yii\Cycle\Command\CycleDependencyProxy $promise, \Psr\EventDispatcher\EventDispatcherInterface $eventDispatcher )
$promise Yiisoft\Yii\Cycle\Command\CycleDependencyProxy
$eventDispatcher \Psr\EventDispatcher\EventDispatcherInterface

                public function __construct(CycleDependencyProxy $promise, private readonly EventDispatcherInterface $eventDispatcher)
{
    parent::__construct($promise);
}

            
createEmptyMigration() protected method
protected \Cycle\Schema\Generator\Migrations\MigrationImage|null createEmptyMigration ( \Symfony\Component\Console\Output\OutputInterface $output, string $name, string|null $database null )
$output \Symfony\Component\Console\Output\OutputInterface
$name string
$database string|null

                protected function createEmptyMigration(
    OutputInterface $output,
    string $name,
    ?string $database = null
): ?MigrationImage {
    if ($database === null) {
        // get default database
        $database = $this->promise->getDatabaseProvider()->database()->getName();
    }
    $migrator = $this->promise->getMigrator();
    $migrationSkeleton = new MigrationImage($this->promise->getMigrationConfig(), $database);
    $migrationSkeleton->setName($name);
    $className = $migrationSkeleton->getClass()->getName();
    \assert($className !== null);
    try {
        $migrationFile = $migrator->getRepository()->registerMigration(
            $migrationSkeleton->buildFileName(),
            $className,
            $migrationSkeleton->getFile()->render()
        );
    } catch (RepositoryException $e) {
        $output->writeln('<fg=yellow>Can not create migration</>');
        /**
         * @infection-ignore-all
         * ConcatOperandRemoval
         * Removing closing tag works (probably it's automatically fixed by formatter), but makes no sense.
         */
        $output->writeln('<fg=red>' . $e->getMessage() . '</>');
        return null;
    }
    $output->writeln('<info>New migration file has been created</info>');
    $output->writeln("<fg=cyan>$migrationFile</>");
    return $migrationSkeleton;
}

            
execute() protected method

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

                #[\Override]
protected function execute(InputInterface $input, OutputInterface $output): int
{
    $migrations = $this->findMigrations($output);
    // check any not executed migration
    $exist = false;
    foreach ($migrations as $migration) {
        if ($migration->getState()->getStatus() === State::STATUS_PENDING) {
            $exist = true;
            /**
             * @infection-ignore-all Break_
             * Replacing with `continue` works as well, but early exit was added for performance reasons.
             */
            break;
        }
    }
    if (!$exist) {
        $output->writeln('<fg=red>No migration found for execute</>');
        return self::SUCCESS;
    }
    $migrator = $this->promise->getMigrator();
    // Confirm
    if (!$migrator->getConfig()->isSafe()) {
        $newMigrations = [];
        foreach ($migrations as $migration) {
            if ($migration->getState()->getStatus() === State::STATUS_PENDING) {
                $newMigrations[] = $migration;
            }
        }
        $countNewMigrations = count($newMigrations);
        $output->writeln(
            '<fg=yellow>' .
            ($countNewMigrations === 1 ? 'Migration' : $countNewMigrations . ' migrations') .
            ' ' .
            'to be applied:</>'
        );
        foreach ($newMigrations as $migration) {
            $output->writeln('— <fg=cyan>' . $migration->getState()->getName() . '</>');
        }
        if ($input->isInteractive()) {
            $question = new ConfirmationQuestion(
                'Apply the above ' .
                ($countNewMigrations === 1 ? 'migration' : 'migrations') .
                '? (yes|no) ',
                false
            );
            /** @var QuestionHelper $qaHelper*/
            $qaHelper = $this->getHelper('question');
            if (!$qaHelper->ask($input, $output, $question)) {
                return self::SUCCESS;
            }
        }
    }
    $this->eventDispatcher->dispatch(new BeforeMigrate());
    try {
        do {
            $migration = $migrator->run();
            if (!$migration instanceof MigrationInterface) {
                break;
            }
            $state = $migration->getState();
            $status = $state->getStatus();
            $output->writeln('<fg=cyan>' . $state->getName() . '</>: '
                . (self::MIGRATION_STATUS[$status] ?? $status));
        } while (true);
    } finally {
        $this->eventDispatcher->dispatch(new AfterMigrate());
    }
    return self::SUCCESS;
}

            
findMigrations() protected method
protected \Cycle\Migrations\MigrationInterface[] findMigrations ( \Symfony\Component\Console\Output\OutputInterface $output )
$output \Symfony\Component\Console\Output\OutputInterface

                protected function findMigrations(OutputInterface $output): array
{
    $list = $this->promise->getMigrator()->getMigrations();
    $output->writeln(
        sprintf(
            '<info>Total %d migration(s) found in %s</info>',
            count($list),
            $this->promise->getMigrationConfig()->getDirectory()
        )
    );
    return $list;
}