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