diff --git a/extend/catcher/generate/Generator.php b/extend/catcher/generate/Generator.php index eb4f204..a8d0431 100644 --- a/extend/catcher/generate/Generator.php +++ b/extend/catcher/generate/Generator.php @@ -6,7 +6,9 @@ use catcher\exceptions\FailedException; use catcher\generate\factory\Controller; use catcher\generate\factory\Migration; use catcher\generate\factory\Model; +use catcher\generate\factory\Route; use catcher\generate\factory\SQL; +use think\facade\Db; class Generator { @@ -24,30 +26,42 @@ class Generator [$controller, $model] = $this->parseParams($params); $message = []; - if ($params['create_controller']) { - if ((new Controller)->done($controller)) { + + $files = []; + $migration = ''; + $table = null; + + try { + if ($params['create_controller']) { + $files[] = (new Controller)->done($controller); array_push($message, 'controller created successfully'); } - } - if ($params['create_table']) { - if ((new SQL)->done($model)) { + if ($params['create_table']) { + $table = (new SQL)->done($model); array_push($message, 'table created successfully'); } - } - if ($params['create_model']) { - if ((new Model)->done($model)) { + if ($params['create_model']) { + $files[] = (new Model)->done($model); array_push($message, 'model created successfully'); } - } - if ($params['create_migration']) { - if ((new Migration)->done([$controller['module'], $model['table']])) { + if ($params['create_migration']) { + $migration = (new Migration)->done([$controller['module'], $model['table']]); array_push($message, 'migration created successfully'); } + } catch (\Exception $exception) { + $this->rollback($files, $migration, $table); + throw new FailedException($exception->getMessage()); } + // 只有最后成功才写入 route + (new Route())->controller($params['controller']) + ->restful($params['restful']) + ->methods((new Controller())->parseOtherMethods($params['other_function'])) + ->done(); + return $message; } @@ -115,4 +129,36 @@ class Generator return [$controller, $model]; } + + + /** + * 回滚 + * + * @param $files + * @param $migration + * @param $table + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + * @author JaguarJack + * @date 2020/7/11 + */ + protected function rollback($files, $migration, $table) + { + if ((new SQL())->hasTableExists($table)) { + Db::query(sprintf('drop table %s', $table)); + } + + foreach ($files as $file) { + unlink($file); + } + + if ($migration && unlink($migration)) { + $model = new class extends \think\Model { + protected $name = 'migrations'; + }; + + $model->order('version', 'desc')->find()->delete(); + } + } } diff --git a/extend/catcher/generate/factory/Controller.php b/extend/catcher/generate/factory/Controller.php index 0a9c8df..36c06e7 100644 --- a/extend/catcher/generate/factory/Controller.php +++ b/extend/catcher/generate/factory/Controller.php @@ -18,11 +18,9 @@ class Controller extends Factory public function done($params) { // 写入成功之后 - if (file_put_contents($this->getGeneratePath($params['controller']), $this->getContent($params))) { - return (new Route())->controller($params['controller']) - ->restful($params['restful']) - ->methods($this->parseOtherMethods($params['other_function'])) - ->done(); + $controllerPath = $this->getGeneratePath($params['controller']); + if (file_put_contents($controllerPath, $this->getContent($params))) { + return $controllerPath; } throw new FailedException($params['controller'] . ' generate failed~'); diff --git a/extend/catcher/generate/factory/Factory.php b/extend/catcher/generate/factory/Factory.php index c42595b..ced3db9 100644 --- a/extend/catcher/generate/factory/Factory.php +++ b/extend/catcher/generate/factory/Factory.php @@ -89,7 +89,7 @@ abstract class Factory * @param $table * @return bool */ - protected function hasTableExists($table) + public function hasTableExists($table) { $tables = Db::getConnection()->getTables(); diff --git a/extend/catcher/generate/factory/Migration.php b/extend/catcher/generate/factory/Migration.php index 13f8497..e01dc85 100644 --- a/extend/catcher/generate/factory/Migration.php +++ b/extend/catcher/generate/factory/Migration.php @@ -48,6 +48,6 @@ class Migration extends Factory } } - return true; + return $file; } } \ No newline at end of file diff --git a/extend/catcher/generate/factory/Model.php b/extend/catcher/generate/factory/Model.php index 76cf4be..bb38221 100644 --- a/extend/catcher/generate/factory/Model.php +++ b/extend/catcher/generate/factory/Model.php @@ -12,13 +12,15 @@ class Model extends Factory { $content = $this->getContent($params); - file_put_contents($this->getGeneratePath($params['model']), $content); + $modelPath = $this->getGeneratePath($params['model']); - if (!file_exists($this->getGeneratePath($params['model']))) { + file_put_contents($modelPath, $content); + + if (!file_exists($modelPath)) { throw new FailedException('create model failed'); } - return true; + return $modelPath; } /** diff --git a/extend/catcher/generate/factory/SQL.php b/extend/catcher/generate/factory/SQL.php index 6293af8..6c269d6 100644 --- a/extend/catcher/generate/factory/SQL.php +++ b/extend/catcher/generate/factory/SQL.php @@ -19,7 +19,7 @@ class SQL extends Factory throw new FailedException(sprintf('create table [%s] failed', $params['table'])); } - return true; + return $params['table']; } /**