Files
portal/app/Classes/CodeGenerator/Common/GeneratorConfig.php
T
2020-09-14 16:36:40 +08:00

414 lines
13 KiB
PHP

<?php
namespace App\Classes\CodeGenerator\Common;
use Illuminate\Support\Str;
class GeneratorConfig
{
/* Namespace variables */
public $nsApp;
public $nsModel;
public $nsModelExtend;
public $nsController;
public $nsBaseController;
public $nsApiTests;
public $nsTestTraits;
public $nsTests;
/* Path variables */
public $pathModel;
public $pathFactory;
public $pathSeeder;
public $pathDatabaseSeeder;
public $pathApiRoutes;
public $pathApiTests;
public $pathController;
public $pathRoutes;
/* Model Names */
public $mName;
public $mPlural;
public $mCamel;
public $mCamelPlural;
public $mSnake;
public $mSnakePlural;
public $mDashed;
public $mDashedPlural;
public $mSlash;
public $mSlashPlural;
public $mHuman;
public $mHumanPlural;
public $connection = '';
/* Generator Options */
public $options;
/* Prefixes */
public $prefixes;
/** @var CommandData */
private $commandData;
/* Command Options */
public static $availableOptions = [
'fieldsFile',
'jsonFromGUI',
'tableName',
'fromTable',
'ignoreFields',
'save',
'primary',
'prefix',
'skip',
'views',
'relations',
'plural',
'softDelete',
'forceMigrate',
'factory',
'seeder',
];
public static $excludeFields = ['id', 'created_at', 'updated_at', 'deleted_at'];
public $tableName;
/** @var string */
protected $primaryName;
/* Generator AddOns */
public $addOns;
public function init(CommandData &$commandData, $options = null)
{
if (!empty($options)) {
self::$availableOptions = $options;
}
$this->mName = $commandData->modelName;
$this->prepareAddOns();
$this->prepareOptions($commandData);
$this->prepareModelNames();
$this->preparePrefixes();
$this->loadPaths();
$this->prepareTableName();
$this->preparePrimaryName();
$this->loadNamespaces($commandData);
$commandData = $this->loadDynamicVariables($commandData);
$this->commandData = &$commandData;
}
public function loadNamespaces(CommandData &$commandData)
{
$prefix = $this->prefixes['ns'];
if (!empty($prefix)) {
$prefix = '\\'.$prefix;
}
$this->nsApp = $commandData->commandObj->getLaravel()->getNamespace();
$this->nsApp = substr($this->nsApp, 0, strlen($this->nsApp) - 1);
$this->nsModel = 'App\Models';
$this->nsModelExtend = 'App\Models\AbstractModel';
$this->nsBaseController = 'App\Http\Controllers';
$this->nsController = 'App\Http\Controllers'.$prefix;
$this->nsApiTests = 'Tests\APIs';
$this->nsTests = 'Tests';
}
public function loadPaths()
{
$prefix = $this->prefixes['path'];
if (!empty($prefix)) {
$prefix .= '/';
}
$this->pathModel = app_path('Models/');
$this->pathApiRoutes = base_path('routes/api.php');
$this->pathApiTests = base_path('tests/APIs/');
$this->pathController = app_path('Http/Controllers/').$prefix;
$this->pathRoutes = base_path('routes/web.php');
$this->pathFactory = database_path('factories/');
$this->pathSeeder = database_path('seeds/');
$this->pathDatabaseSeeder = database_path('seeds/DatabaseSeeder.php');
}
public function loadDynamicVariables(CommandData &$commandData)
{
$commandData->addDynamicVariable('$NAMESPACE_APP$', $this->nsApp);
$commandData->addDynamicVariable('$NAMESPACE_MODEL$', $this->nsModel);
$commandData->addDynamicVariable('$NAMESPACE_MODEL_EXTEND$', $this->nsModelExtend);
$commandData->addDynamicVariable('$NAMESPACE_BASE_CONTROLLER$', $this->nsBaseController);
$commandData->addDynamicVariable('$NAMESPACE_CONTROLLER$', $this->nsController);
$commandData->addDynamicVariable('$NAMESPACE_API_TESTS$', $this->nsApiTests);
$commandData->addDynamicVariable('$NAMESPACE_TESTS$', $this->nsTests);
$commandData->addDynamicVariable('$TABLE_NAME$', $this->tableName);
$commandData->addDynamicVariable('$TABLE_NAME_TITLE$', Str::studly($this->tableName));
$commandData->addDynamicVariable('$PRIMARY_KEY_NAME$', $this->primaryName);
$commandData->addDynamicVariable('$MODEL_NAME$', $this->mName);
$commandData->addDynamicVariable('$MODEL_NAME_CAMEL$', $this->mCamel);
$commandData->addDynamicVariable('$MODEL_NAME_PLURAL$', $this->mPlural);
$commandData->addDynamicVariable('$MODEL_NAME_PLURAL_CAMEL$', $this->mCamelPlural);
$commandData->addDynamicVariable('$MODEL_NAME_SNAKE$', $this->mSnake);
$commandData->addDynamicVariable('$MODEL_NAME_PLURAL_SNAKE$', $this->mSnakePlural);
$commandData->addDynamicVariable('$MODEL_NAME_DASHED$', $this->mDashed);
$commandData->addDynamicVariable('$MODEL_NAME_PLURAL_DASHED$', $this->mDashedPlural);
$commandData->addDynamicVariable('$MODEL_NAME_SLASH$', $this->mSlash);
$commandData->addDynamicVariable('$MODEL_NAME_PLURAL_SLASH$', $this->mSlashPlural);
$commandData->addDynamicVariable('$MODEL_NAME_HUMAN$', $this->mHuman);
$commandData->addDynamicVariable('$MODEL_NAME_PLURAL_HUMAN$', $this->mHumanPlural);
$commandData->addDynamicVariable('$FILES$', '');
if (!empty($this->prefixes['route'])) {
$commandData->addDynamicVariable('$ROUTE_NAMED_PREFIX$', $this->prefixes['route'].'.');
$commandData->addDynamicVariable('$ROUTE_PREFIX$', str_replace('.', '/', $this->prefixes['route']).'/');
$commandData->addDynamicVariable('$RAW_ROUTE_PREFIX$', $this->prefixes['route']);
} else {
$commandData->addDynamicVariable('$ROUTE_PREFIX$', '');
$commandData->addDynamicVariable('$ROUTE_NAMED_PREFIX$', '');
}
if (!empty($this->prefixes['ns'])) {
$commandData->addDynamicVariable('$PATH_PREFIX$', $this->prefixes['ns'].'\\');
} else {
$commandData->addDynamicVariable('$PATH_PREFIX$', '');
}
if (!empty($this->prefixes['view'])) {
$commandData->addDynamicVariable('$VIEW_PREFIX$', str_replace('/', '.', $this->prefixes['view']).'.');
} else {
$commandData->addDynamicVariable('$VIEW_PREFIX$', '');
}
if (!empty($this->prefixes['public'])) {
$commandData->addDynamicVariable('$PUBLIC_PREFIX$', $this->prefixes['public']);
} else {
$commandData->addDynamicVariable('$PUBLIC_PREFIX$', '');
}
$commandData->addDynamicVariable(
'$API_PREFIX$',
'api'
);
$commandData->addDynamicVariable(
'$API_VERSION$',
'v1'
);
$commandData->addDynamicVariable('$SEARCHABLE$', '');
return $commandData;
}
public function prepareTableName()
{
if ($this->getOption('tableName')) {
$this->tableName = $this->getOption('tableName');
} else {
$this->tableName = $this->mSnakePlural;
}
}
public function preparePrimaryName()
{
if ($this->getOption('primary')) {
$this->primaryName = $this->getOption('primary');
} else {
$this->primaryName = 'id';
}
}
public function prepareModelNames()
{
if ($this->getOption('plural')) {
$this->mPlural = $this->getOption('plural');
} else {
$this->mPlural = Str::plural($this->mName);
}
$this->mCamel = Str::camel($this->mName);
$this->mCamelPlural = Str::camel($this->mPlural);
$this->mSnake = Str::snake($this->mName);
$this->mSnakePlural = Str::snake($this->mPlural);
$this->mDashed = str_replace('_', '-', Str::snake($this->mSnake));
$this->mDashedPlural = str_replace('_', '-', Str::snake($this->mSnakePlural));
$this->mSlash = str_replace('_', '/', Str::snake($this->mSnake));
$this->mSlashPlural = str_replace('_', '/', Str::snake($this->mSnakePlural));
$this->mHuman = Str::title(str_replace('_', ' ', Str::snake($this->mSnake)));
$this->mHumanPlural = Str::title(str_replace('_', ' ', Str::snake($this->mSnakePlural)));
}
public function prepareOptions(CommandData &$commandData)
{
foreach (self::$availableOptions as $option) {
$this->options[$option] = $commandData->commandObj->option($option);
}
if (isset($options['fromTable']) and $this->options['fromTable']) {
if (!$this->options['tableName']) {
$commandData->commandError('tableName required with fromTable option.');
exit;
}
}
$this->options['softDelete'] = true;
if (!empty($this->options['skip'])) {
$this->options['skip'] = array_map('trim', explode(',', $this->options['skip']));
}
}
public function preparePrefixes()
{
$this->prefixes['route'] = explode('/', '');
$this->prefixes['path'] = explode('/', '');
$this->prefixes['view'] = explode('.', '');
$this->prefixes['public'] = explode('/', '');
if ($this->getOption('prefix')) {
$multiplePrefixes = explode('/', $this->getOption('prefix'));
$this->prefixes['route'] = array_merge($this->prefixes['route'], $multiplePrefixes);
$this->prefixes['path'] = array_merge($this->prefixes['path'], $multiplePrefixes);
$this->prefixes['view'] = array_merge($this->prefixes['view'], $multiplePrefixes);
$this->prefixes['public'] = array_merge($this->prefixes['public'], $multiplePrefixes);
}
$this->prefixes['route'] = array_diff($this->prefixes['route'], ['']);
$this->prefixes['path'] = array_diff($this->prefixes['path'], ['']);
$this->prefixes['view'] = array_diff($this->prefixes['view'], ['']);
$this->prefixes['public'] = array_diff($this->prefixes['public'], ['']);
$routePrefix = '';
foreach ($this->prefixes['route'] as $singlePrefix) {
$routePrefix .= Str::camel($singlePrefix).'.';
}
if (!empty($routePrefix)) {
$routePrefix = substr($routePrefix, 0, strlen($routePrefix) - 1);
}
$this->prefixes['route'] = $routePrefix;
$nsPrefix = '';
foreach ($this->prefixes['path'] as $singlePrefix) {
$nsPrefix .= Str::title($singlePrefix).'\\';
}
if (!empty($nsPrefix)) {
$nsPrefix = substr($nsPrefix, 0, strlen($nsPrefix) - 1);
}
$this->prefixes['ns'] = $nsPrefix;
$pathPrefix = '';
foreach ($this->prefixes['path'] as $singlePrefix) {
$pathPrefix .= Str::title($singlePrefix).'/';
}
if (!empty($pathPrefix)) {
$pathPrefix = substr($pathPrefix, 0, strlen($pathPrefix) - 1);
}
$this->prefixes['path'] = $pathPrefix;
$viewPrefix = '';
foreach ($this->prefixes['view'] as $singlePrefix) {
$viewPrefix .= Str::camel($singlePrefix).'/';
}
if (!empty($viewPrefix)) {
$viewPrefix = substr($viewPrefix, 0, strlen($viewPrefix) - 1);
}
$this->prefixes['view'] = $viewPrefix;
$publicPrefix = '';
foreach ($this->prefixes['public'] as $singlePrefix) {
$publicPrefix .= Str::camel($singlePrefix).'/';
}
if (!empty($publicPrefix)) {
$publicPrefix = substr($publicPrefix, 0, strlen($publicPrefix) - 1);
}
$this->prefixes['public'] = $publicPrefix;
}
public function overrideOptionsFromJsonFile($jsonData)
{
$options = self::$availableOptions;
foreach ($options as $option) {
if (isset($jsonData['options'][$option])) {
$this->setOption($option, $jsonData['options'][$option]);
}
}
// prepare prefixes than reload namespaces, paths and dynamic variables
if (!empty($this->getOption('prefix'))) {
$this->preparePrefixes();
$this->loadPaths();
$this->loadNamespaces($this->commandData);
$this->loadDynamicVariables($this->commandData);
}
}
public function getOption($option)
{
if (isset($this->options[$option])) {
return $this->options[$option];
}
return false;
}
public function getAddOn($addOn)
{
if (isset($this->addOns[$addOn])) {
return $this->addOns[$addOn];
}
return false;
}
public function setOption($option, $value)
{
$this->options[$option] = $value;
}
public function prepareAddOns()
{
$this->addOns['tests'] = false;
}
public function excludeFields()
{
return self::$excludeFields;
}
}