Очистка вывода справки по команде консоли - PullRequest
0 голосов
/ 10 марта 2020

У меня довольно много laravel консольных команд в моих приложениях для задач обслуживания, и в подавляющем большинстве случаев некоторые из параметров по умолчанию, представленных в диалоговом окне справки, необходимы и поддерживаются моим вариантом использования. Типичный вывод справки выглядит следующим образом:

Description:
  Do stuff

Usage:
  myapp:mycommand

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Мне не нравится идея представления опций пользователю, которые я не собираюсь поддерживать, поэтому я бы хотел опустить кучу этих опций в --help текст для очистки отображаемой информации. Например, флаги --no-interaction, --no-ansi, --ansi, --verbose и др. c. До сих пор я не смог найти какой-либо элегантный (laravel) способ сделать это. Есть предложения?

1 Ответ

1 голос
/ 10 марта 2020

Откройте файл app\Console\Kernel.php, который входит в стандартную комплектацию laravel. Он расширяет Illuminate\Foundation\Console\Kernel.

Теперь вы можете переписать конструктор следующим кодом:

    // Define a property where the keys are the command name, and the values
    // are arrays with the options that you are allowed to pass. 
    protected $optionFilters = [
        'my-command-name' => [
            'user',
            'raw',
        ]
    ];

    public function __construct(Application $app, Dispatcher $events)
    {
        parent::__construct($app, $events);

        $commands = $this->getArtisan()->all();

        foreach ($commands as $command) {
            // Now we simply loop all registered commands, and see if we should
            // apply a filter.
            if ($filter = array_get($this->optionFilters, $command->getName())) {
                $options = array_filter(
                    $command->getDefinition()->getOptions(),
                    function (\Symfony\Component\Console\Input\InputOption$option) use ($filter) {
                        return in_array($option->getName(), $filter);
                });
                // Set the new options to the command.
                $command->getDefinition()->setOptions($options);
            }
        }
    }

Теперь, если вы ранее определили такую ​​команду, как:

protected $signature = 'my-command-name {--user} {--raw} {--type}';

Выполнение вышеупомянутого l oop исключило бы {--type} из команды.

Я заметил некоторые побочные эффекты, хотя при удалении опций из собственных ремесленных команд Laravel (например, php artisan help команда, которая выдавала некоторые ошибки при удалении опции --format). Поэтому вам придется проверить кое-что из этого.

Также есть getArguments() и setArguments(), которые можно использовать для пропуска аргументов, таких как {user?} или {user=foo} (параметры запускаются с -- в определении команды, аргументы нет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...