微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – Symfony控制台 – 显示没有参数的命令的帮助

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

我按照this guide创建了Application类的扩展.

这是应用程序的正常用法,它工作正常:
PHP应用程序<参数>

这也可以正常工作(带选项的参数):
PHP application.PHP< argument> – 有些选项

如果有人在没有任何参数或选项的情况下运行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);
}

认情况下,使用null InputInterface调用Application :: run(),所以在这里我想我可以检查参数的原始值并强制添加一个帮助选项以传递给父方法.

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

解决方法:

要根据命令执行特定操作,可以使用在触发onConsoleCommand时调用的EventListener.

监听器类应该如下工作:

<?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 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐