diff --git a/extend/catcher/command/InstallCommand.php b/extend/catcher/command/InstallCommand.php index ad96ec6..6d7e473 100644 --- a/extend/catcher/command/InstallCommand.php +++ b/extend/catcher/command/InstallCommand.php @@ -18,7 +18,7 @@ class InstallCommand extends Command protected function configure() { $this->setName('catch:install') - // ->addArgument('module', Argument::REQUIRED, 'module name') + ->addOption('reinstall', '-r',Option::VALUE_NONE, 'reinstall back') ->setDescription('install project'); } @@ -31,17 +31,23 @@ class InstallCommand extends Command */ protected function execute(Input $input, Output $output) { - $this->detectionEnvironment(); + if ($input->getOption('reinstall')) { + $this->reInstall(); + $this->project(); + } else { - $this->firstStep(); + $this->detectionEnvironment(); - $this->secondStep(); + $this->firstStep(); - $this->thirdStep(); + $this->secondStep(); - $this->finished(); + $this->thirdStep(); - $this->project(); + $this->finished(); + + $this->project(); + } } /** @@ -94,6 +100,7 @@ class InstallCommand extends Command $this->output->info('🎉 environment checking finished'); } + /** * 安装第一步 * @@ -160,19 +167,41 @@ class InstallCommand extends Command 'connections' => $connections, ], 'database'); - foreach (CatchAdmin::getModulesDirectory() as $directory) { - $moduleInfo = CatchAdmin::getModuleInfo($directory); - if (is_dir(CatchAdmin::moduleMigrationsDirectory($moduleInfo['alias']))) { - $output = Console::call('catch-migrate:run', [$moduleInfo['alias']]); - $this->output->info(sprintf('module [%s] migrations %s', $moduleInfo['alias'], $output->fetch())); - - $seedOut = Console::call('catch-seed:run', [$moduleInfo['alias']]); - $this->output->info(sprintf('module [%s] seeds %s', $moduleInfo['alias'], $seedOut->fetch())); - } - } + $this->migrateAndSeeds(); } } + /** + * 生成表结构 + * + * @time 2020年01月20日 + * @return void + */ + protected function migrateAndSeeds(): void + { + foreach (CatchAdmin::getModulesDirectory() as $directory) { + $moduleInfo = CatchAdmin::getModuleInfo($directory); + if (is_dir(CatchAdmin::moduleMigrationsDirectory($moduleInfo['alias']))) { + $output = Console::call('catch-migrate:run', [$moduleInfo['alias']]); + $this->output->info(sprintf('module [%s] migrations %s', $moduleInfo['alias'], $output->fetch())); + + $seedOut = Console::call('catch-seed:run', [$moduleInfo['alias']]); + $this->output->info(sprintf('module [%s] seeds %s', $moduleInfo['alias'], $seedOut->fetch())); + } + } + } + + protected function migrateRollback() + { + foreach (CatchAdmin::getModulesDirectory() as $directory) { + $moduleInfo = CatchAdmin::getModuleInfo($directory); + if (is_dir(CatchAdmin::moduleMigrationsDirectory($moduleInfo['alias']))) { + $rollbackOut = Console::call('catch-migrate:rollback', [$moduleInfo['alias'], '-f']); + // $this->output->info(sprintf('module [%s] [%s] rollback %s', $moduleInfo['alias'], basename($migration), $rollbackOut->fetch())); + } + } + } + /** * 安装第四步 * @@ -267,41 +296,6 @@ class InstallCommand extends Command return file_exists(root_path() . '.env') ? root_path() . '.env' : ''; } - /** - * 检测根目录 - * - * @time 2019年11月28日 - * @return bool - */ - protected function checkRootDatabase(): bool - { - $databasePath = root_path('database'); - - if (!is_dir($databasePath)) { - if (!mkdir($databasePath, 0777, true) && !is_dir($databasePath)) { - throw new \RuntimeException(sprintf('Directory "%s" was not created', $databasePath)); - } - } - - $migrationPath = $databasePath . DIRECTORY_SEPARATOR . 'migrations' . DIRECTORY_SEPARATOR; - - $seedPath = $databasePath . DIRECTORY_SEPARATOR . 'seeds' . DIRECTORY_SEPARATOR; - - if (!is_dir($migrationPath)) { - if (!mkdir($migrationPath, 0777, true) && !is_dir($migrationPath)) { - throw new \RuntimeException(sprintf('Directory "%s" was not created', $migrationPath)); - } - } - - if (!is_dir($seedPath)) { - if (!mkdir($seedPath, 0777, true) && !is_dir($seedPath)) { - throw new \RuntimeException(sprintf('Directory "%s" was not created', $seedPath)); - } - } - - return true; - } - protected function project() { @@ -323,4 +317,16 @@ class InstallCommand extends Command ', $year)); } + + + protected function reInstall(): void + { + $ask = strtolower($this->output->ask($this->input,'reset project? (Y/N)')); + + if ($ask === 'y' || $ask === 'yes' ) { + $this->migrateRollback(); + + $this->migrateAndSeeds(); + } + } } diff --git a/extend/catcher/command/MigrateCreateCommand.php b/extend/catcher/command/MigrateCreateCommand.php index e502889..4d3600a 100644 --- a/extend/catcher/command/MigrateCreateCommand.php +++ b/extend/catcher/command/MigrateCreateCommand.php @@ -8,3 +8,99 @@ * @copyright By CatchAdmin * @license https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt */ +namespace catcher\command; + +use catcher\CatchAdmin; +use Phinx\Util\Util; +use think\console\Input; +use think\console\input\Argument as InputArgument; +use think\console\Output; +use think\migration\command\migrate\Create; +use think\migration\Creator; + +class MigrateCreateCommand extends Create +{ + /* + * + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('catch-migrate:create') + ->setDescription('Create a new migration') + ->addArgument('module', InputArgument::REQUIRED, 'the module where you create') + ->addArgument('name', InputArgument::REQUIRED, 'What is the name of the migration?') + ->setHelp(sprintf('%sCreates a new database migration%s', PHP_EOL, PHP_EOL)); + } + + /** + * Create the new migration. + * + * @param Input $input + * @param Output $output + * @return void + * @throws InvalidArgumentException + * @throws RuntimeException + */ + protected function execute(Input $input, Output $output) + { + $module = $input->getArgument('module'); + + $className = $input->getArgument('name'); + + $path = $this->create($module, $className); + + $output->writeln('created .' . str_replace(getcwd(), '', realpath($path))); + } + + /** + * + * @time 2020年01月21日 + * @param $module + * @param $className + * @return string + */ + protected function create($module, $className): string + { + $path = CatchAdmin::moduleMigrationsDirectory($module); + + if (!Util::isValidPhinxClassName($className)) { + throw new InvalidArgumentException(sprintf('The migration class name "%s" is invalid. Please use CamelCase format.', $className)); + } + + if (!Util::isUniqueMigrationClassName($className, $path)) { + throw new InvalidArgumentException(sprintf('The migration class name "%s" already exists', $className)); + } + + // Compute the file path + $fileName = Util::mapClassNameToFileName($className); + $filePath = $path . DIRECTORY_SEPARATOR . $fileName; + + if (is_file($filePath)) { + throw new InvalidArgumentException(sprintf('The file "%s" already exists', $filePath)); + } + + // Verify that the template creation class (or the aliased class) exists and that it implements the required interface. + $aliasedClassName = null; + + // Load the alternative template if it is defined. + $contents = file_get_contents($this->getTemplate()); + + // inject the class names appropriate to this migration + $contents = strtr($contents, [ + 'MigratorClass' => $className, + ]); + + if (false === file_put_contents($filePath, $contents)) { + throw new RuntimeException(sprintf('The file "%s" could not be written to', $path)); + } + + return $filePath; + } + + + protected function getTemplate() + { + return __DIR__ . '/stubs/migrate.stub'; + } +} diff --git a/extend/catcher/command/MigrateRollbackCommand.php b/extend/catcher/command/MigrateRollbackCommand.php index 17efe1c..acfe469 100644 --- a/extend/catcher/command/MigrateRollbackCommand.php +++ b/extend/catcher/command/MigrateRollbackCommand.php @@ -8,3 +8,107 @@ * @copyright By CatchAdmin * @license https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt */ + +namespace catcher\command; + +use catcher\CatchAdmin; +use Phinx\Db\Adapter\AdapterFactory; +use Phinx\Migration\MigrationInterface; +use think\console\Input; +use think\console\input\Argument; +use think\console\input\Option as InputOption; +use think\console\Output; +use think\facade\Console; +use think\migration\command\migrate\Rollback; +use think\migration\command\migrate\Run; + +class MigrateRollbackCommand extends Rollback +{ + protected $module; + + protected function configure() + { + $this->setName('catch-migrate:rollback') + ->setDescription('Rollback the last or to a specific migration') + ->addArgument('module', Argument::REQUIRED, 'migrate the module database') + ->addOption('--target', '-t', InputOption::VALUE_REQUIRED, 'The version number to rollback to') + ->addOption('--date', '-d', InputOption::VALUE_REQUIRED, 'The date to rollback to') + ->addOption('--force', '-f', InputOption::VALUE_NONE, 'Force rollback to ignore breakpoints') + ->setHelp(<<catch-migrate:rollback command reverts the last migration, or optionally up to a specific version + +php think catch-migrate:rollback +php think catch-migrate:rollback module -t 20111018185412 +php think catch-migrate:rollback module -d 20111018 +php think catch-migrate:rollback -v + +EOT + ); + } + + /** + * Rollback the migration. + * + * @param Input $input + * @param Output $output + * @return void + */ + protected function execute(Input $input, Output $output) + { + $this->module = $input->getArgument('module'); + $version = $input->getOption('target'); + $date = $input->getOption('date'); + $force = !!$input->getOption('force'); + + // rollback the specified environment + $start = microtime(true); + if (null !== $date) { + $this->rollbackToDateTime(new \DateTime($date), $force); + } else { + if (!$version) { + $migrations = glob(CatchAdmin::moduleMigrationsDirectory($this->module) . '*.php'); + foreach ($migrations as $migration) { + $version = explode('_', basename($migration))[0]; + $this->rollback($version, $force); + } + } else { + $this->rollback($version, $force); + } + } + $end = microtime(true); + $this->migrations = null; + $output->writeln(''); + $output->writeln('All Done. Took ' . sprintf('%.4fs', $end - $start) . ''); + } + + /** + * 获取 migration path + * + * @time 2019年12月03日 + * @return string + */ + protected function getPath(): string + { + return CatchAdmin::moduleMigrationsDirectory($this->module); + } + + /** + * + * @time 2020年01月21日 + * @param null $version + * @param bool $force + * @return void + */ + protected function rollback($version = null, $force = false) + { + $migrations = $this->getMigrations(); + $versionLog = $this->getVersionLog(); + $versions = array_keys($versionLog); + + foreach ($migrations as $key => $migration) { + if (in_array($key, $versions)) { + $this->executeMigration($migration, MigrationInterface::DOWN); + } + } + } +} diff --git a/extend/catcher/command/MigrateRunCommand.php b/extend/catcher/command/MigrateRunCommand.php index 95bd6b4..894cffc 100644 --- a/extend/catcher/command/MigrateRunCommand.php +++ b/extend/catcher/command/MigrateRunCommand.php @@ -23,8 +23,8 @@ class MigrateRunCommand extends Run The migrate:run command runs all available migrations, optionally up to a specific version php think catch-migrate:run module -php think catch-migrate:run -t 20110103081132 -php think catch-migrate:run -d 20110103 +php think catch-migrate:run module -t 20110103081132 +php think catch-migrate:run module -d 20110103 php think catch-migrate:run -v EOT @@ -63,4 +63,4 @@ EOT { return CatchAdmin::moduleMigrationsDirectory($this->module); } -} \ No newline at end of file +}