5

我在 Symfony 控制台应用程序中定义了两个命令,clean-redis-keys并且clean-temp-files. 我想定义一个clean执行这两个命令的命令。

我该怎么做?

4

2 回答 2

5

请参阅有关如何调用其他命令的文档:

从另一个调用命令很简单:

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 回答