Php Symfony控制台-显示无参数命令的帮助

Php Symfony控制台-显示无参数命令的帮助,php,symfony,symfony-console,Php,Symfony,Symfony Console,我正在开发一个非常简单的Symfony控制台应用程序。它只有一个带一个参数的命令和几个选项 我随后创建了应用程序类的扩展 这是应用程序的正常用法,并且工作正常: php应用程序 这也很好(带有选项的参数): php application.php——一些选项 如果有人在没有任何参数或选项的情况下运行php application.php,我希望它像用户运行php application.php--help一样运行 我确实有一个可行的解决方案,但它不是最优的,可能有点脆弱。在扩展的应用程序类中,我

我正在开发一个非常简单的Symfony控制台应用程序。它只有一个带一个参数的命令和几个选项

我随后创建了
应用程序
类的扩展

这是应用程序的正常用法,并且工作正常:
php应用程序

这也很好(带有选项的参数):
php application.php——一些选项

如果有人在没有任何参数或选项的情况下运行
php application.php
,我希望它像用户运行
php application.php--help
一样运行

我确实有一个可行的解决方案,但它不是最优的,可能有点脆弱。在扩展的
应用程序
类中,我重写了
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);
}
/**
*重写父方法,以便在无参数或选项的情况下调用应用程序时使用--help选项
*
*@param InputInterface | null$input
*@param OutputInterface | null$output
*@return int
*@throws\Exception
*/
公共函数运行(InputInterface$input=null,OutputInterface$output=null)
{
如果($input==null){

if(count($_SERVER[“argv”])我设法找到了一个解决方案,它根本不涉及触及
应用程序
类。要从另一个命令中调用help命令:

/**
 * @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);
}

要根据命令执行特定操作,您可以使用
EventListener
,当触发
onconsolecomand
时调用该函数

listener类应按如下方式工作:

<?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());
        }
    }
}

我认为您的解决方案很好,为什么您认为它很脆弱?我不喜欢它在现有输入抽象之外工作。它也不是最可读的代码。如果您看到类似
If($this->hasNoArguments()){$this->addOption(“help”,true)}
,更具可读性。谢谢。我认为你的答案虽然更详细,需要额外的课程,但与我自己的答案相比,可能更像是“正确的方法”,因为它能更好地抽象事物。当我有机会时,我会测试它,如果它是正确的,请接受你的答案。我本周不在,所以可能需要一段时间才能开始:)不客气。我的主要目标是,如果人们有同样的需求,他可以在这里找到答案。现在我知道如何使用内置的
HelpCommand
。谢谢你提出的好问题
services:
     # ...
     app.console_event_listener:
         class: AppBundle\EventListener\ConsoleEventListener
         tags:
             - { name: kernel.event_listener, event: console.command, method: onConsoleCommand }