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
+}