【发布时间】:2016-03-15 22:21:06
【问题描述】:
我目前正在一个 Laravel 5.1 项目中创建一个 php artisan 控制台命令,并且想从我的控制台命令中调用另一个控制台命令。我要调用的这个第三方命令不接受任何选项或参数,而是通过交互式问题接收其输入。
我知道我可以使用如下选项和参数调用命令:
$this->call('command:name', ['argument' => 'foo', '--option' => 'bar']);
我也知道我可以从命令行调用交互式命令而无需像这样的交互:
php artisan command:name --no-interaction
但是如何在我的命令中回答这些交互式问题呢?
我想做类似下面的事情(伪代码)。
$this->call('command:name', [
'argument' => 'foo',
'--option' => 'bar'
], function($console) {
$console->writeln('Yes'); //answer an interactive question
$console-writeln('No'); //answer an interactive question
$console->writeln(''); //skip answering an interactive question
} );
上面当然不行,因为$this->call($command, $arguments)不接受第三个回调参数。
从控制台命令调用控制台命令时如何回答交互式问题?
【问题讨论】:
-
我对这个问题很感兴趣。我已经在 Laravel 沙盒中玩了一个小时左右,看看我是否可以让它工作。我得出了一个不幸的结论,即实现此功能将是大量的工作。目前,无法通过在另一个调用中进行的调用传递任何内容,而无需通过参数提供默认值。
-
@DavidBarker 我通过在 Symfony 类方法 QuestionHelper@doAsk 中添加 5 行代码使其工作(现在)。我目前正在集思广益,考虑如何在不触及核心的情况下增强这种方法,考虑使用
runkit_method_redefine()。如果/当我成功时会更新这篇文章。欢迎提出建议。 -
仍然非常老套,但如果没有 Symfony 组件中可用的功能,我想不出或看到任何其他方法来实现您需要的功能。
标签: php laravel console command laravel-artisan