8

我正在开发一个非常简单的 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()使用 null 调用InputInterface,所以在这里我想我可以检查参数的原始值并强制添加一个帮助选项以传递给父方法。

有没有更好的方法来实现这一目标?

4

2 回答 2

9

我设法找到了一个完全不涉及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);
}
于 2016-02-04T16:44:18.863 回答
3

要根据命令执行特定操作,您可以使用在触发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 }
于 2016-02-05T12:44:39.083 回答