5

Symfony コンソール アプリケーションで 2 つのコマンドを定義していclean-redis-keysますclean-temp-filescleanこの 2 つのコマンドを実行するコマンドを定義したいと考えています。

どうすればいいですか?

4

2 に答える 2

5

How to Call Other Commandsに関するドキュメントを参照してください。

コマンドを別のコマンドから呼び出すのは簡単です。

use Symfony\Component\Console\Input\ArrayInput;
// ...

protected function execute(InputInterface $input, OutputInterface $output)
{
    $command = $this->getApplication()->find('demo:greet');

    $arguments = array(
        'command' => 'demo:greet',
        'name'    => 'Fabien',
        '--yell'  => true,
    );

    $greetInput = new ArrayInput($arguments);
    $returnCode = $command->run($greetInput, $output);

    // ...
}

まず、find()コマンド名を渡して実行したいコマンドを指定します。ArrayInput次に、コマンドに渡したい引数とオプションで新しいを作成する必要があります。

最終的に、メソッドを呼び出すとrun()実際にコマンドが実行され、コマンドから返されたコード (コマンドのexecute()メソッドからの戻り値) が返されます。

于 2016-12-25T11:35:49.327 に答える
2

アプリケーション インスタンスを取得し、コマンドを見つけて実行します。

protected function configure()
{
    $this->setName('clean');
}

protected function execute(InputInterface $input, OutputInterface $output)
{
    $app = $this->getApplication();

    $cleanRedisKeysCmd = $app->find('clean-redis-keys');
    $cleanRedisKeysInput = new ArrayInput([]);

    $cleanTempFilesCmd = $app->find('clean-temp-files');
    $cleanTempFilesInput = new ArrayInput([]);

    // Note if "subcommand" returns an exit code, run() method will return it.
    $cleanRedisKeysCmd->run($cleanRedisKeysInput, $output);
    $cleanTempFilesCmd->run($cleanTempFilesInput, $output);
}

コードの重複を避けるために、サブコマンドを呼び出すジェネリック メソッドを作成できます。このようなもの:

private function executeSubCommand(string $name, array $parameters, OutputInterface $output)
{
    return $this->getApplication()
        ->find($name)
        ->run(new ArrayInput($parameters), $output);
}   
于 2016-12-25T11:44:27.160 に答える