mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/tickme.git
synced 2026-08-19 20:43:58 +00:00
414 lines
13 KiB
PHP
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;
|
|
}
|
|
}
|