【问题标题】:Call Symfony console command within another command and suppress output在另一个命令中调用 Symfony 控制台命令并禁止输出
【发布时间】:2015-01-09 01:00:48
【问题描述】:

我有一个使用 Symfony 控制台组件的简单控制台应用程序。

我有两个可以轻松独立调用的命令(例如,cmdOnecmdTwo)。

$ myApp.php cmdOne
$ myApp.php cmdTwo

这两个命令都有大量输出,我可以通过发出-q 选项轻松地将其静音。

现在,我希望cmdOne 致电cmdTwo,但我希望cmdTwo 保持安静。我并没有试图做任何疯狂的事情,但是尽管阅读了文档,但我仍在努力实现目标。

到目前为止,这是我的示例代码(此 sn-p 将包含在 cmdOne->execute() 中):

$command = $this->getApplication()->find('cmdTwo');

$input = new ArrayInput(array(
    'command' => 'cmdTwo',
    '-q' => true
));

$returnCode = $command->run($input, $output);

这运行良好,就像代码命令执行时一样,但是我不想显示控制台上的输出(由cmdTwo 生成)。

是否无法指定 -q 选项,因为它是“保留的”(即不是由开发人员创建的),还是我遗漏了一些明显的东西?

【问题讨论】:

    标签: php symfony console-application


    【解决方案1】:

    不要传递相同的$output 实例(输出到当前控制台的那个),而是创建NullOutput 的实例

    $returnCode = $command->run($input, new \Symfony\Component\Console\Output\NullOutput);
    

    它基本上是一个黑洞——它接受输出并默默地丢弃它。

    【讨论】:

    • @cerebriform:由于 phpstorm 启动时间缓慢并重新索引项目(以找出确切的类名),它比可能花费的时间多 2 分钟;-P
    • 太棒了!这是一种享受,谢谢你(和其他人);现在这是一个曲线球:如果cmdTwo 失败,是否有一种明智的方法来捕捉输出?目前,如果直接运行,它只会直接向控制台出错——我是否应该为某些错误返回特定的退出代码,然后在cmdOne 中处理它们?或者这完全是另一个问题......
    • 但是,但是,我使用的平板电脑屏幕油腻,无法配合。 :)
    • @HelloPablo:这取决于。该命令要单独使用吗?您可以扩展 Output 抽象类并将整个输出捕获到字符串。
    • @zerkms 我将把 cmdOnecmdTwo 重命名为 installmigrate。我希望install 执行migrate 作为其过程的一部分,但如果migrate 失败,那么我希望install 在控制台上出现错误。 migrate 也需要能够独立运行。更清晰?还是一清二楚?
    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多