From 0b546a20be40e73c4f4d43f8dcd6a851be01e0fb Mon Sep 17 00:00:00 2001 From: JaguarJack Date: Tue, 28 Apr 2020 22:02:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extend/catcher/generate/Generator.php | 75 +++++++++++++++-- .../catcher/generate/factory/Controller.php | 78 +++++++++-------- extend/catcher/generate/factory/Factory.php | 20 ++++- extend/catcher/generate/factory/Migration.php | 39 +++++++++ extend/catcher/generate/factory/Model.php | 70 ++++++++++++++++ extend/catcher/generate/factory/Request.php | 1 - extend/catcher/generate/factory/Route.php | 4 +- extend/catcher/generate/factory/SQL.php | 66 ++++++++++++--- extend/catcher/generate/template/Content.php | 2 +- .../catcher/generate/template/Controller.php | 7 +- extend/catcher/generate/template/Model.php | 84 +++++++++++++++++-- extend/catcher/generate/template/Request.php | 2 +- 12 files changed, 376 insertions(+), 72 deletions(-) create mode 100644 extend/catcher/generate/factory/Migration.php diff --git a/extend/catcher/generate/Generator.php b/extend/catcher/generate/Generator.php index e8092d5..5db216a 100644 --- a/extend/catcher/generate/Generator.php +++ b/extend/catcher/generate/Generator.php @@ -1,9 +1,12 @@ generate($params['controller']));die; + [$controller, $model] = $this->parseParams($params); - (new Controller())->done($params['controller']); + $message = []; + if ($params['create_controller']) { + if ((new Controller)->done($controller)) { + array_push($message, 'controller created successfully'); + } + } + + if ($params['create_table']) { + if ((new SQL)->done($model)) { + array_push($message, 'table created successfully'); + } + } + + if ($params['create_model']) { + if ((new Model)->done($model)) { + array_push($message, 'model created successfully'); + } + } + + if ($params['create_migration']) { + if ((new Migration)->done([$controller['module'], $model['table']])) { + array_push($message, 'migration created successfully'); + } + } + + return $message; } public function preview($type, $params) { $class = ucfirst($type); - (new $class)->done(); + (new $class)->done($params); + } + + + /** + * parse params + * + * @time 2020年04月28日 + * @param $params + * @return array[] + */ + protected function parseParams($params) + { + if (!$params['controller']['module'] ?? false) { + throw new FailedException('请设置模块'); + } + + $controller = [ + 'module' => $params['controller']['module'], + 'model' => $params['controller']['model'] ?? '', + 'controller' => $params['controller']['controller'] ?? '', + 'restful' => $params['controller']['restful'], + 'other_function' => $params['controller']['other_function'], + ]; + + $model = [ + 'table' => $params['controller']['table'], + 'model' => $params['controller']['model'], + 'sql' => $params['model']['data'], + 'extra' => $params['model']['extra'], + ]; + + + return [$controller, $model]; } } diff --git a/extend/catcher/generate/factory/Controller.php b/extend/catcher/generate/factory/Controller.php index 7d5288d..9a86050 100644 --- a/extend/catcher/generate/factory/Controller.php +++ b/extend/catcher/generate/factory/Controller.php @@ -1,8 +1,8 @@ getGeneratePath($params['controller']), $this->getContent($params))) { + return (new Route())->controller($params['controller']) + ->restful($params['restful']) + ->methods($this->parseOtherMethods($params['other_function'])) + ->done(); + } + + throw new FailedException($params['controller'] . ' generate failed~'); + } + + /** + * 获取内容 + * + * @time 2020年04月28日 + * @param $params + * @return bool|string|string[] + */ + protected function getContent($params) { if (!$params['controller']) { - return false; + throw new FailedException('params has lost~'); } $template = new Template(); @@ -30,23 +50,30 @@ class Controller extends Factory // parse model [$model, $modelNamespace] = $this->parseFilename($params['model']); + + $use = implode(';',[ + 'use ' . $params['model'] .' as '. $model . 'Model', + ]) . ';'; + $content = $template->header() . - $template->nameSpace($namespace) . - str_replace('{USE}', $model ? 'use ' . $params['model'] .';' : '', $template->uses()) . - $template->createClass($className); + $template->nameSpace($namespace) . + str_replace('{USE}', $model ? $use : '', $template->uses()) . + $template->createClass($className); - - $content = str_replace('{CONTENT}', ($model ? $template->construct($model) : '') . rtrim($this->content($params, $template), "\r\n"), $content); - - // 写入成功之后 - if (file_put_contents($this->getGeneratePath($params['controller']), $content)) { - (new Route())->controller($params['controller']) - ->restful($params['restful']) - ->methods($this->parseOtherMethods($params['other_function'])) - ->done(); - } + return str_replace('{CONTENT}', ($model ? $template->construct($model.'Model') : '') . rtrim($this->content($params, $template), "\r\n"), $content); } + /** + * parse use + * + * @time 2020年04月28日 + * @param $params + * @return string + */ + protected function parseUse($params) + { + + } /** * content * @@ -77,25 +104,6 @@ class Controller extends Factory return $content; } - /** - * parse filename - * - * @time 2020年04月27日 - * @param $filename - * @return array - */ - public function parseFilename($filename) - { - $namespace = explode('\\', $filename); - - $className = ucfirst(array_pop($namespace)); - - $namespace = implode('\\', $namespace); - - return [$className, $namespace]; - } - - /** * parse $method diff --git a/extend/catcher/generate/factory/Factory.php b/extend/catcher/generate/factory/Factory.php index 0e2b5b9..252aa1f 100644 --- a/extend/catcher/generate/factory/Factory.php +++ b/extend/catcher/generate/factory/Factory.php @@ -1,5 +1,5 @@ getDatabase()->getAllTables($tableName); + + $file = $migrationPath . date('YmdHis') . '_'. $tableName . '.php'; + + foreach ($tables as $table) { + if ($table->getName() == $tableName) { + file_put_contents($file, $migrateGenerator->getMigrationContent($table)); + if (!file_exists($file)) { + throw new FailedException('migration generate failed'); + } + break; + } + } + + return true; + } +} \ No newline at end of file diff --git a/extend/catcher/generate/factory/Model.php b/extend/catcher/generate/factory/Model.php index b3d9bbc..2fdd0d9 100644 --- a/extend/catcher/generate/factory/Model.php +++ b/extend/catcher/generate/factory/Model.php @@ -1 +1,71 @@ parseFilename($params['model']); + + if (!$modelName) { + throw new FailedException('create Model Failed'); + } + + $content = $template->useTrait($extra['soft_delete']) . + $template->name($table) . + $template->field($this->parseField($table)); + + $class = $template->header() . + $template->nameSpace($namespace) . + $template->uses($extra['soft_delete']) . + $template->createModel($modelName, $table); + + + $file = $this->getGeneratePath($params['model']); + + file_put_contents($file, str_replace('{CONTENT}', $content, $class)); + + if (!file_exists($file)) { + throw new FailedException('create model failed'); + } + + return true; + } + + + /** + * parse field + * + * @time 2020年04月28日 + * @param $table + * @return string + */ + protected function parseField($table) + { + $columns = Db::query('show full columns from ' . + config('database.connections.mysql.prefix') . $table); + + $new = []; + foreach ($columns as $field) { + $new[$field['Field']] = $field['Comment']; + } + + $fields = []; + foreach ($new as $field => $comment) { + $fields[] = sprintf("'%s', // %s", $field, $comment); + } + + return implode("\r\n\t\t", $fields); + } +} \ No newline at end of file diff --git a/extend/catcher/generate/factory/Request.php b/extend/catcher/generate/factory/Request.php index b3d9bbc..e69de29 100644 --- a/extend/catcher/generate/factory/Request.php +++ b/extend/catcher/generate/factory/Request.php @@ -1 +0,0 @@ -createSQL($params)); + Db::execute($this->createSQL($params)); + + // 判断表是否创建成功 + if (!$this->hasTableExists($params['table'])) { + throw new FailedException(sprintf('create table [%s] failed',$params['table'])); } - $table = \config('database.connections.mysql.prefix') . $params['controller']['table']; + return true; + } - $extra = $params['model']['extra']; + /** + * create table sql + * + * @time 2020年04月28日 + * @param $params + * @return string + */ + protected function createSQL($params) + { + if (!$params['table'] ?? false) { + throw new FailedException('table name has lost~'); + } + $table = \config('database.connections.mysql.prefix') . $params['table']; + + if ($this->hasTableExists($table)) { + throw new FailedException(sprintf('table [%s] has existed', $params['table'])); + } + + $extra = $params['extra']; // 主键 $createSql = $this->primaryKey($extra['primary_key']); // 字段 $ifHaveNotFields = true; - foreach ($params['model']['data'] as $sql) { + foreach ($params['sql'] as $sql) { if (!$sql['field'] || !$sql['type']) { continue; } @@ -30,7 +57,7 @@ class SQL } // 如果没有设置数据库字段 if ($ifHaveNotFields) { - return false; + throw new FailedException('Do you have set mysql fields?'); } // 创建时间 if ($extra['created_at'] ?? false) { @@ -44,11 +71,11 @@ class SQL if ($this->index) { $createSql .= $this->index; } + $createSql = rtrim($createSql, ',' . PHP_EOL); // 创建表 SQL return $this->createTable($table, $createSql, $extra['engine'], 'utf8mb4', $extra['comment']); } - /** * parse sql * @@ -69,7 +96,7 @@ class SQL $sql['type'], $sql['length'] ? sprintf('(%s)', $sql['length']) : '', $sql['unsigned'] ? 'unsigned' : '', - $sql['default'] ? 'default ' . $sql['default']: '', + $sql['default'] ?? '', $sql['nullable'] ? 'not null' : '', $sql['comment'] ? sprintf('comment \'%s\'', $sql['comment']) : '' ]) . ','. PHP_EOL; @@ -139,13 +166,26 @@ class SQL protected function parseIndex($index, $field) { if ($index == 'unique') { - $this->index .= "unique index unique_ . $field($field)"; + $this->index .= "unique index unique_$field($field)," . PHP_EOL; } elseif ($index == 'index') { - $this->index .= "index($field)"; + $this->index .= "index($field),". PHP_EOL; } elseif ($index == 'fulltext') { - $this->index .= "fulltext key fulltext_ .$field($field)"; + $this->index .= "fulltext key fulltext_$field($field)," . PHP_EOL; } elseif ($index == 'spatial') { - $this->index .= "spatial index spatial_.$field($field)"; + $this->index .= "spatial index spatial_$field($field),". PHP_EOL; } } + + /** + * + * @time 2020年04月28日 + * @param $table + * @return bool + */ + protected function hasTableExists($table) + { + $tables = Db::getConnection()->getTables(); + + return in_array($table, $tables); + } } \ No newline at end of file diff --git a/extend/catcher/generate/template/Content.php b/extend/catcher/generate/template/Content.php index e446658..013e403 100644 --- a/extend/catcher/generate/template/Content.php +++ b/extend/catcher/generate/template/Content.php @@ -1,5 +1,5 @@ catchSearch() - ->order(\$this->getPk(), 'desc') - ->paginate(); - } +class {$model} extends Model +{ + {CONTENT} +} TMP; } + public function useTrait($hasDeletedAt = true) + { + if (!$hasDeletedAt) { + return <<