catchAdmin/extend/catcher/command/CreateModuleCommand.php

220 lines
7.1 KiB
PHP
Raw Normal View History

2019-12-18 18:54:01 +08:00
<?php
2019-12-19 07:19:15 +08:00
namespace catcher\command;
2019-12-18 18:54:01 +08:00
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
2019-12-19 07:19:15 +08:00
use think\console\input\Option;
2019-12-18 18:54:01 +08:00
use think\console\Output;
2019-12-19 07:19:15 +08:00
use catcher\CatchAdmin;
use think\helper\Str;
2019-12-18 18:54:01 +08:00
class CreateModuleCommand extends Command
{
protected $module;
protected $moduleDir;
2019-12-19 07:19:15 +08:00
protected $stubDir;
2019-12-18 18:54:01 +08:00
protected $namespaces;
protected function configure()
{
2019-12-19 07:19:15 +08:00
$this->setName('create:module')
2019-12-18 18:54:01 +08:00
->addArgument('module', Argument::REQUIRED, 'module name')
2019-12-19 07:19:15 +08:00
->addOption('controller', '-c',Option::VALUE_REQUIRED, 'controller name')
->addOption('migration', '-m',Option::VALUE_REQUIRED, 'migration name')
->addOption('seed', '-s',Option::VALUE_REQUIRED, 'seed name')
2020-01-23 18:21:08 +08:00
->addOption('service', '-e',Option::VALUE_REQUIRED, 'service name')
2019-12-18 18:54:01 +08:00
->setDescription('create module service');
}
protected function execute(Input $input, Output $output)
{
$this->module = strtolower($input->getArgument('module'));
$this->moduleDir = CatchAdmin::moduleDirectory($this->module);
2019-12-19 07:19:15 +08:00
$this->stubDir = __DIR__ . DIRECTORY_SEPARATOR .'stubs'. DIRECTORY_SEPARATOR;
2019-12-18 18:54:01 +08:00
2020-01-23 17:16:02 +08:00
$composer = json_decode(file_get_contents($this->app->getRootPath() . 'composer.json'), true);
2019-12-18 18:54:01 +08:00
2020-01-23 17:16:02 +08:00
$psr4 = $composer['autoload']['psr-4'];
foreach ($psr4 as $namespace => $des) {
if ($des === CatchAdmin::NAME) {
$this->namespaces = $namespace . $this->module . '\\';
break;
}
}
2019-12-18 18:54:01 +08:00
$this->createController();
2019-12-19 07:19:15 +08:00
$this->createService();
$this->createMigration();
$this->createSeeds();
2019-12-18 18:54:01 +08:00
$this->createRoute();
$output->warning('module created');
}
2020-01-23 18:21:08 +08:00
/**
*
* @time 2020年01月23日
* @return void
*/
protected function createController(): void
2019-12-18 18:54:01 +08:00
{
2019-12-19 07:19:15 +08:00
$controllers = $this->input->getOption('controller');
2019-12-18 18:54:01 +08:00
2019-12-19 07:19:15 +08:00
$controllerPath = $this->moduleDir . 'controller' . DIRECTORY_SEPARATOR;
2019-12-18 18:54:01 +08:00
2020-01-23 18:21:08 +08:00
if ($controllers) {
CatchAdmin::makeDirectory($controllerPath);
2019-12-18 18:54:01 +08:00
2020-01-23 18:21:08 +08:00
foreach ($controllers as $controller) {
2019-12-19 07:19:15 +08:00
file_put_contents($controllerPath . ucfirst($controller) . '.php', str_replace(
2020-01-23 18:21:08 +08:00
['{CLASS}', '{NAMESPACE}', '{MODULE}'],
[ucfirst($controller), $this->namespaces . 'controller', $this->module],
file_get_contents($this->stubDir . 'controller.stub')
2019-12-19 07:19:15 +08:00
));
2020-01-23 18:21:08 +08:00
}
2019-12-19 07:19:15 +08:00
2020-01-23 18:21:08 +08:00
$this->output->info('🎉 create controller successfully');
$this->createRequest($controllers);
}
2019-12-18 18:54:01 +08:00
}
2020-01-23 18:21:08 +08:00
/**
*
* @time 2020年01月23日
* @param $controllers
* @return void
*/
protected function createRequest($controllers): void
2019-12-18 18:54:01 +08:00
{
2020-01-23 18:21:08 +08:00
$requestPath = $this->moduleDir . 'request' . DIRECTORY_SEPARATOR;
2019-12-19 07:19:15 +08:00
CatchAdmin::makeDirectory($requestPath);
$default = ['CreateRequest.php', 'UpdateRequest.php'];
if (count($controllers) === 1) {
2020-01-23 18:21:08 +08:00
CatchAdmin::makeDirectory($requestPath . ucwords($controllers[0]));
2019-12-19 07:19:15 +08:00
foreach ($default as $v) {
2020-01-23 18:21:08 +08:00
file_put_contents($requestPath . $controllers[0] . DIRECTORY_SEPARATOR . $v, str_replace(
2019-12-19 07:19:15 +08:00
['{NAMESPACE}', '{CLASS}'],
2020-01-23 18:21:08 +08:00
[$this->namespaces . $controllers[0]. '\\request', 'Create'],
2019-12-19 07:19:15 +08:00
file_get_contents($this->stubDir. 'request.stub')));
}
} else {
foreach ($controllers as $controller) {
CatchAdmin::makeDirectory($requestPath . ucwords($controller));
foreach ($default as $v) {
file_put_contents($requestPath . ucwords($controller). DIRECTORY_SEPARATOR . $v, str_replace(
['{NAMESPACE}', '{CLASS}'],
[$this->namespaces . 'request' . ucwords($controller), 'Create'],
file_get_contents($this->stubDir . 'request.stub')));
}
}
}
2019-12-18 18:54:01 +08:00
}
2020-01-23 18:21:08 +08:00
/**
*
* @time 2020年01月23日
* @return void
*/
protected function createMigration(): void
2019-12-18 18:54:01 +08:00
{
2019-12-19 07:19:15 +08:00
$migrations = $this->input->getOption('migration');
$migrationPath = $this->moduleDir . 'database'.DIRECTORY_SEPARATOR.'migrations'.DIRECTORY_SEPARATOR;
if ($migrations) {
2020-01-23 18:21:08 +08:00
CatchAdmin::makeDirectory($migrationPath);
2019-12-19 07:19:15 +08:00
$migrations = explode(',', $migrations);
foreach ($migrations as $migration) {
$filename = date('Ymdhis', time()) . '_' .Str::snake($migration) . '.php';
file_put_contents($migrationPath . $filename, str_replace(
['{CLASS}'], [ucfirst($migration)], file_get_contents($this->stubDir.'migration.stub')));
}
$this->output->info('🎉 create migrations successfully');
}
2019-12-18 18:54:01 +08:00
}
2019-12-19 07:19:15 +08:00
protected function createSeeds()
2019-12-18 18:54:01 +08:00
{
2019-12-19 07:19:15 +08:00
$seeds = $this->input->getOption('seed');
$seedPath = $this->moduleDir . 'database'.DIRECTORY_SEPARATOR.'seeds'.DIRECTORY_SEPARATOR;
if ($seeds) {
2020-01-23 18:21:08 +08:00
CatchAdmin::makeDirectory($seedPath);
2019-12-19 07:19:15 +08:00
$seeds = explode(',', $seeds);
foreach ($seeds as $seed) {
$filename = ucfirst(Str::camel($seed)) . 'Seed.php';
file_put_contents($seedPath . $filename, str_replace(
['{CLASS}'], [ucfirst($seed)], file_get_contents($this->stubDir.'seeder.stub')));
}
$this->output->info('🎉 create seeds successfully');
}
2019-12-18 18:54:01 +08:00
}
2020-01-23 18:21:08 +08:00
/**
*
* @time 2020年01月23日
* @param $service
* @return void
*/
protected function moduleJson($service): void
2019-12-18 18:54:01 +08:00
{
2020-01-23 18:21:08 +08:00
if (!file_exists($this->moduleDir.DIRECTORY_SEPARATOR .'module.json')) {
file_put_contents($this->moduleDir . DIRECTORY_SEPARATOR . 'module.json', str_replace(
['{MODULE}', '{SERVICE}'],
[$this->module, $service ? $this->namespaces . ucfirst($service) . 'Service' : ''],
file_get_contents($this->stubDir . 'module.stub')));
2019-12-19 07:19:15 +08:00
$this->output->info('🎉 create module.json successfully');
2020-01-23 18:21:08 +08:00
}
2019-12-18 18:54:01 +08:00
}
2020-01-23 18:21:08 +08:00
/**
*
* @time 2020年01月23日
* @return void
*/
protected function createRoute(): void
2019-12-18 18:54:01 +08:00
{
2020-01-23 18:21:08 +08:00
if (!file_exists($this->moduleDir.DIRECTORY_SEPARATOR .'route.php')) {
file_put_contents($this->moduleDir . DIRECTORY_SEPARATOR . 'route.php',
file_get_contents($this->stubDir . 'route.stub'));
2019-12-19 07:19:15 +08:00
$this->output->info('🎉 create route.php successfully');
2020-01-23 18:21:08 +08:00
}
2019-12-18 18:54:01 +08:00
}
2020-01-23 18:21:08 +08:00
/**
*
* @time 2020年01月23日
* @return void
*/
protected function createService(): void
2019-12-18 18:54:01 +08:00
{
2019-12-19 07:19:15 +08:00
$service = $this->input->getOption('service');
if ($service) {
file_put_contents($this->moduleDir . DIRECTORY_SEPARATOR . ucfirst($this->module) . 'Service.php', str_replace(
['{CLASS}', '{NAMESPACE}'],
2020-01-23 18:21:08 +08:00
[ucfirst($service), $this->namespaces . '\\' . $this->module],
2019-12-19 07:19:15 +08:00
file_get_contents($this->stubDir.'service.stub')));
$this->output->info('🎉 create service successfully');
}
2020-01-23 18:21:08 +08:00
$this->moduleJson($service);
2019-12-18 18:54:01 +08:00
}
}