104 lines
3.2 KiB
PHP
104 lines
3.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace Webman\Console\Commands;
|
||
|
|
|
||
|
|
use Symfony\Component\Console\Command\Command;
|
||
|
|
use Symfony\Component\Console\Input\InputInterface;
|
||
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
||
|
|
use Symfony\Component\Console\Input\InputArgument;
|
||
|
|
use Webman\Console\Util;
|
||
|
|
|
||
|
|
|
||
|
|
class MakeControllerCommand extends Command
|
||
|
|
{
|
||
|
|
protected static $defaultName = 'make:controller';
|
||
|
|
protected static $defaultDescription = 'Make controller';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
protected function configure()
|
||
|
|
{
|
||
|
|
$this->addArgument('name', InputArgument::REQUIRED, 'Controller name');
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param InputInterface $input
|
||
|
|
* @param OutputInterface $output
|
||
|
|
* @return int
|
||
|
|
*/
|
||
|
|
protected function execute(InputInterface $input, OutputInterface $output): int
|
||
|
|
{
|
||
|
|
$name = $input->getArgument('name');
|
||
|
|
$output->writeln("Make controller $name");
|
||
|
|
$suffix = config('app.controller_suffix', '');
|
||
|
|
|
||
|
|
if ($suffix && !strpos($name, $suffix)) {
|
||
|
|
$name .= $suffix;
|
||
|
|
}
|
||
|
|
|
||
|
|
$name = str_replace('\\', '/', $name);
|
||
|
|
if (!($pos = strrpos($name, '/'))) {
|
||
|
|
$name = ucfirst($name);
|
||
|
|
$controller_str = Util::guessPath(app_path(), 'controller') ?: 'controller';
|
||
|
|
$file = app_path() . "/$controller_str/$name.php";
|
||
|
|
$namespace = $controller_str === 'Controller' ? 'App\Controller' : 'app\controller';
|
||
|
|
} else {
|
||
|
|
$name_str = substr($name, 0, $pos);
|
||
|
|
if($real_name_str = Util::guessPath(app_path(), $name_str)) {
|
||
|
|
$name_str = $real_name_str;
|
||
|
|
} else if ($real_section_name = Util::guessPath(app_path(), strstr($name_str, '/', true))) {
|
||
|
|
$upper = strtolower($real_section_name[0]) !== $real_section_name[0];
|
||
|
|
} else if ($real_base_controller = Util::guessPath(app_path(), 'controller')) {
|
||
|
|
$upper = strtolower($real_base_controller[0]) !== $real_base_controller[0];
|
||
|
|
}
|
||
|
|
$upper = $upper ?? strtolower($name_str[0]) !== $name_str[0];
|
||
|
|
if ($upper && !$real_name_str) {
|
||
|
|
$name_str = preg_replace_callback('/\/([a-z])/', function ($matches) {
|
||
|
|
return '/' . strtoupper($matches[1]);
|
||
|
|
}, ucfirst($name_str));
|
||
|
|
}
|
||
|
|
$path = "$name_str/" . ($upper ? 'Controller' : 'controller');
|
||
|
|
$name = ucfirst(substr($name, $pos + 1));
|
||
|
|
$file = app_path() . "/$path/$name.php";
|
||
|
|
$namespace = str_replace('/', '\\', ($upper ? 'App/' : 'app/') . $path);
|
||
|
|
}
|
||
|
|
$this->createController($name, $namespace, $file);
|
||
|
|
|
||
|
|
return self::SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param $name
|
||
|
|
* @param $namespace
|
||
|
|
* @param $file
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
protected function createController($name, $namespace, $file)
|
||
|
|
{
|
||
|
|
$path = pathinfo($file, PATHINFO_DIRNAME);
|
||
|
|
if (!is_dir($path)) {
|
||
|
|
mkdir($path, 0777, true);
|
||
|
|
}
|
||
|
|
$controller_content = <<<EOF
|
||
|
|
<?php
|
||
|
|
|
||
|
|
namespace $namespace;
|
||
|
|
|
||
|
|
use support\Request;
|
||
|
|
|
||
|
|
class $name
|
||
|
|
{
|
||
|
|
public function index(Request \$request)
|
||
|
|
{
|
||
|
|
return response(__CLASS__);
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
EOF;
|
||
|
|
file_put_contents($file, $controller_content);
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|