215 lines
5.3 KiB
PHP
Raw Normal View History

2022-12-05 23:01:12 +08:00
<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2021 https://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/JaguarJack/catchadmin-laravel/blob/master/LICENSE.md )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace Modules\Develop\Support\Generate;
use Catch\Exceptions\FailedException;
use Exception;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Modules\Develop\Support\Generate\Create\Controller;
use Modules\Develop\Support\Generate\Create\FrontForm;
use Modules\Develop\Support\Generate\Create\FrontTable;
use Modules\Develop\Support\Generate\Create\Model;
use Modules\Develop\Support\Generate\Create\Request;
use Modules\Develop\Support\Generate\Create\Route;
/**
* @class Generator
*/
class Generator
{
/**
* @var array{module:string,controller:string,model:string,paginate: bool,schema: string}
*/
protected array $gen;
/**
* @var array{name: string,charset: string, collection: string,
* comment:string,created_at: bool, updated_at: bool, deleted_at: bool,
* creator_id: bool, updated_at: bool, engine: string}
*/
protected array $schema;
/**
* @var array
*/
protected array $structures;
/**
* @var array
*/
protected array $files = [];
/**
* this model name from controller
*
* @var string
*/
protected string $modelName;
/**
* this request name for controller
*
* @var ?string
*/
protected ?string $requestName;
/**
* generate
*
* @throws Exception
* @return bool
*/
public function generate(): bool
{
try {
$this->files[] = $this->createModel();
$this->files[] = $this->createRequest();
$this->files[] = $this->createController();
$this->files[] = $this->createFrontTable();
$this->files[] = $this->createFrontForm();
$this->files[] = $this->createRoute();
} catch (Exception $e) {
$this->rollback();
throw new FailedException($e->getMessage());
}
$this->files = [];
return true;
}
/**
* create route
*
* @throws FileNotFoundException
* @return bool|string
*/
public function createRoute(): bool|string
{
// 保存之前的 route 文件
$route = new Route($this->gen['controller']);
return $route->setModule($this->gen['module'])->create();
}
/**
* create font
*
* @throws FileNotFoundException
* @return bool|string|null
*/
public function createFrontTable(): bool|string|null
{
$table = new FrontTable($this->gen['controller'], $this->gen['paginate'], (new Route($this->gen['controller']))->setModule($this->gen['module'])->getApiRute());
return $table->setModule($this->gen['module'])->setStructures($this->structures)->create();
}
/**
* create font
*
* @throws FileNotFoundException
* @return bool|string|null
*/
public function createFrontForm(): bool|string|null
{
$form = new FrontForm($this->gen['controller']);
return $form->setModule($this->gen['module'])->setStructures($this->structures)->create();
}
/**
* create model
*
* @throws FileNotFoundException
* @return bool|string
*/
protected function createModel(): bool|string
{
$model = new Model($this->gen['model'], $this->gen['schema'], $this->gen['module']);
$this->modelName = $model->getModelName();
return $model->setModule($this->gen['module'])->setStructures($this->structures)->create();
}
/**
* create request
*
* @throws FileNotFoundException
* @return bool|string
*/
protected function createRequest(): bool|string
{
$request = new Request($this->gen['controller']);
$file = $request->setStructures($this->structures)->setModule($this->gen['module'])->create();
$this->requestName = $request->getRequestName();
return $file;
}
/**
* create controller
*
* @throws FileNotFoundException
* @return bool|string
*/
protected function createController(): bool|string
{
$controller = new Controller($this->gen['controller'], $this->modelName, $this->requestName);
return $controller->setModule($this->gen['module'])->create();
}
/**
* rollback
*
* @return void
*/
protected function rollback(): void
{
// delete controller & model & migration file
foreach ($this->files as $file) {
unlink($file);
}
// 回填之前的 route 文件
}
/**
* set params
*
* @param array $params
* @return $this
*/
public function setParams(array $params): Generator
{
$this->gen = $params['codeGen'];
$this->structures = $params['structures'];
return $this;
}
}