8

私は非常に単純な Symfony コンソール アプリケーションを開発しています。1 つの引数を持つ 1 つのコマンドと、いくつかのオプションがあります。

このガイドに従って、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()は、 は nullInputInterfaceで呼び出されるため、ここでは、引数の生の値を確認し、ヘルプ オプションを強制的に追加して親メソッドに渡すことができると考えました。

これを達成するためのより良い方法はありますか?

4

2 に答える 2

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 に答える