如何调用其他命令

3.4 版本
维护中的版本

如果一个命令依赖于另一个在它前面运行的(命令),不同于让用户牢记命令的执行顺序,你可以自行直接调用它。当你要创建一个“强力”命令来运行其他命令的组合时(例如,生产环境下的代码发生改变时,所有需要运行的命令就是一个组合:清除缓存、生成doctrine2代理、剥离Assetic资源、等等)也是有用的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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() 来真正执行命令并返回“从命令中返回的code” (即,来自命令的 execute() 方法的返回值)。

如果你希望抑制所执行的命令的输出,传入一个 NullOutput 作为 $command->run() 的第二参数。

注意,所有命令都是在相同的进程内运行,在这种情况下某些内置的Symfony命令将不能工作得很好。例如 cache:clear 以及 cache:warmup 命令会改变一些类的定义,因此在它们之后运行的命令可能会中断。

多数时候,调用一个来自“未在命令行中执行的代码”中的命令,并不是好主意。主要原因是,命令的output是针对控制台进行了优化的,而不是为了传给其他命令的。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)