| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- <?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 Symfony\Component\Console\Question\ConfirmationQuestion;
- use Webman\Console\Util;
- class MakeBootstrapCommand extends Command
- {
- protected static $defaultName = 'make:bootstrap';
- protected static $defaultDescription = 'Make bootstrap';
- /**
- * @return void
- */
- protected function configure()
- {
- $this->addArgument('name', InputArgument::REQUIRED, 'Bootstrap name');
- $this->addArgument('enable', InputArgument::OPTIONAL, 'Enable or not');
- }
- /**
- * @param InputInterface $input
- * @param OutputInterface $output
- * @return int
- */
- protected function execute(InputInterface $input, OutputInterface $output): int
- {
- $name = $input->getArgument('name');
- $enable = in_array($input->getArgument('enable'), ['no', '0', 'false', 'n']) ? false : true;
- $output->writeln("Make bootstrap $name");
- $name = str_replace('\\', '/', $name);
- if (!$bootstrap_str = Util::guessPath(app_path(), 'bootstrap')) {
- $bootstrap_str = Util::guessPath(app_path(), 'controller') === 'Controller' ? 'Bootstrap' : 'bootstrap';
- }
- $upper = $bootstrap_str === 'Bootstrap';
- if (!($pos = strrpos($name, '/'))) {
- $name = ucfirst($name);
- $file = app_path() . DIRECTORY_SEPARATOR . $bootstrap_str . DIRECTORY_SEPARATOR . "$name.php";
- $namespace = $upper ? 'App\Bootstrap' : 'app\bootstrap';
- } else {
- if($real_name = Util::guessPath(app_path(), $name)) {
- $name = $real_name;
- }
- if ($upper && !$real_name) {
- $name = preg_replace_callback('/\/([a-z])/', function ($matches) {
- return '/' . strtoupper($matches[1]);
- }, ucfirst($name));
- }
- $path = "$bootstrap_str/" . substr($upper ? ucfirst($name) : $name, 0, $pos);
- $name = ucfirst(substr($name, $pos + 1));
- $file = app_path() . DIRECTORY_SEPARATOR . $path . DIRECTORY_SEPARATOR . "$name.php";
- $namespace = str_replace('/', '\\', ($upper ? 'App/' : 'app/') . $path);
- }
- if (is_file($file)) {
- $helper = $this->getHelper('question');
- $question = new ConfirmationQuestion("$file already exists. Do you want to override it? (yes/no)", false);
- if (!$helper->ask($input, $output, $question)) {
- return Command::SUCCESS;
- }
- }
- $this->createBootstrap($name, $namespace, $file);
- if ($enable) {
- $this->addConfig("$namespace\\$name", config_path() . '/bootstrap.php');
- }
- return self::SUCCESS;
- }
- /**
- * @param $name
- * @param $namespace
- * @param $file
- * @return void
- */
- protected function createBootstrap($name, $namespace, $file)
- {
- $path = pathinfo($file, PATHINFO_DIRNAME);
- if (!is_dir($path)) {
- mkdir($path, 0777, true);
- }
- $bootstrap_content = <<<EOF
- <?php
- namespace $namespace;
- use Webman\Bootstrap;
- class $name implements Bootstrap
- {
- public static function start(\$worker)
- {
- // Is it console environment ?
- \$is_console = !\$worker;
- if (\$is_console) {
- // If you do not want to execute this in console, just return.
- return;
- }
- }
- }
- EOF;
- file_put_contents($file, $bootstrap_content);
- }
- public function addConfig($class, $config_file)
- {
- $config = include $config_file;
- if(!in_array($class, $config ?? [])) {
- $config_file_content = file_get_contents($config_file);
- $config_file_content = preg_replace('/\];/', " $class::class,\n];", $config_file_content);
- file_put_contents($config_file, $config_file_content);
- }
- }
- }
|