从命令中运行多个Symfony控制台命令

时间:2016-12-25 08:04:26

标签: php symfony-components symfony-console

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

我该怎么做?

2 个答案:

答案 0 :(得分:4)

请参阅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()方法返回值)。

答案 1 :(得分: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);
}