我正在调用一个自定义的Artisan命令,该命令通常在运行时显示输出。但是,从DatabaseSeeder
调用时,默认情况下不会共享该接口,因此不会显示任何输出。有没有办法将控制台输出接口从DatabaseSeeder
传递到Artisan:call
?
如果你的例子更合适:
class DatabaseSeeder extends Seeder {
public function run() {
Eloquent::unguard();
$this->call('ApplicationsSeeder');
foreach(Config::get('app.steam_appids') as $appid) {
Artisan::call('schema:update', array('appid' => $appid)); // No output :(
}
...
Artisan::call
可以接受第三个参数,但它必须实现Symphony\Component\Console\Output\OutputInterface
,我不确定是否可以从Seeder对象传递它。
答案 0 :(得分:2)
是的,我们可以使用第三个参数进行输出。 BufferedOutput就是您所需要的。它扩展了实现OutputInterface的Output类。所以你可以使用这个BufferedOutput类实例。
use Symfony\Component\Console\Output\BufferedOutput;
class DatabaseSeeder extends Seeder {
public function run()
{
Eloquent::unguard();
$output = new BufferedOutput; // instance
$this->call('ApplicationsSeeder');
foreach(Config::get('app.steam_appids') as $appid) {
Artisan::call('schema:update', array('appid' => $appid), $output);
$output->fetch(); // returns content
}
}
答案 1 :(得分:2)
如果您希望在输出实际生成时将输出写入控制台/终端,您可以通过调用以下方式使用播种机OutputInterface
:
$this->command->getOutput();
如果您希望在迁移中使用长时间运行的命令(而不是在命令运行时锁定控制台,那么显示ProgressBar
或类似的内容可能会很好),这非常有用)。
示例:
Artisan::call('command:longrunningcommand', array(), $this->command->getOutput());
这将使命令使用与播种器相同的缓冲区。
答案 2 :(得分:2)
更正这一点,因为这仍然是Google在许多相关搜索中的最佳结果。
从Laravel 5.4开始,Artisan::call()
现在接受包含输出实例的第3个参数,就像之前一样。
来源:https://github.com/laravel/framework/issues/16763#issuecomment-268837505