Консоль Symfony — отображение справки для команды без аргументов

Я занимаюсь разработкой довольно простого консольного приложения Symfony. Он имеет только одну команду с одним аргументом и несколько опций.

Я последовал за это руководство создать расширение Application учебный класс.

Это нормальное использование для приложения, и оно отлично работает:
php application <argument>

Это также отлично работает (аргумент с параметрами):
php application.php <argument> --some-option

Если кто-то бежит php application.php без каких-либо аргументов или опций, я хочу, чтобы он работал так, как если бы пользователь запустил php application.php --help,

У меня есть рабочее решение, но оно не оптимально и, возможно, слегка ломко. В моей расширенной Application класс, я преодолел run() метод следующим образом:

/**
* Override parent method so that --help options is used when app is called with no arguments or options
*
* @param InputInterface|null $input
* @param OutputInterface|null $output
* @return int
* @throws \Exception
*/
public function run(InputInterface $input = null, OutputInterface $output = null)
{
if ($input === null) {
if (count($_SERVER["argv"]) <= 1) {
$args = array_merge($_SERVER["argv"], ["--help"]);
$input = new ArgvInput($args);
}
}
return parent::run($input, $output);
}

По умолчанию, Application::run() вызывается с нулем InputInterfaceИтак, здесь я решил, что могу просто проверить необработанное значение аргументов и принудительно добавить параметр справки для передачи в родительский метод.

Есть ли лучший способ добиться этого?

2

Решение

Чтобы выполнить определенное действие в зависимости от команды, вы можете использовать EventListener который называется, когда onConsoleCommand уволен.

Класс слушателя должен работать следующим образом:

<?php

namespace AppBundle\EventListener;

use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Command\HelpCommand;

class ConsoleEventListener
{
public function onConsoleCommand(ConsoleCommandEvent $event)
{
$application = $event->getCommand()->getApplication();
$inputDefinition = $application->getDefinition();

if ($inputDefinition->getArgumentCount() < 2) {
$help = new HelpCommand();
$help->setCommand($event->getCommand());

return $help->run($event->getInput(), $event->getOutput());
}
}
}

Сервисная декларация:

services:
# ...
app.console_event_listener:
class: AppBundle\EventListener\ConsoleEventListener
tags:
- { name: kernel.event_listener, event: console.command, method: onConsoleCommand }
1

Другие решения

Мне удалось выработать решение, которое не включает в себя прикосновение к Application класс вообще. Чтобы вызвать команду справки из другой команды:

/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int
* @throws \Symfony\Component\Console\Exception\ExceptionInterface
*/
protected function outputHelp(InputInterface $input, OutputInterface $output)
{
$help = new HelpCommand();
$help->setCommand($this);
return $help->run($input, $output);
}
2

По вопросам рекламы [email protected]