如何在同一行显示Laravel artisan命令输出


How to display Laravel artisan command output on same line?

我想用一系列简单的点来显示处理进度。这在浏览器中很容易,只做echo '.',它在同一行,但是当我向artisan命令行发送数据时,我如何在同一行做到这一点?

随后对$this->info('.')的每次调用都将点放在新行上。

方法info使用writeln,它在末尾添加一个换行符,您需要使用write

//in your command
$this->output->write('my inline message', false);
$this->output->write('my inline message continues', false);

可能有点主题,因为您只想要一系列点。但是你可以使用Laravel的内置功能在artisan命令中轻松地呈现进度条。

这样声明一个类变量:

protected $progressbar;

像这样初始化进度条,在fire()方法中:

$this->progressbar = $this->getHelperSet()->get('progress');
$this->progressbar->start($this->output, Model::count());

然后像这样做:

foreach (Model::all() as $instance)
{
    $this->progressbar->advance(); //do stuff before or after this
}

并在完成时通过调用this来完成进度:

$this->progressbar->finish();

更新:对于Laravel 5.1+更简单的语法更方便:

  1. 初始化$bar = $this->output->createProgressBar(count($foo));
  2. Advance $bar->advance();
  3. 完成$bar->finish();

如果您查看源代码,您将看到$this->info实际上只是$this->output->writeln的快捷方式:source。

你可以使用$this->output->write('<info>.</info>')来使它内联。

如果你发现自己经常使用这个方法,你可以创建自己的helper方法,如:

public function inlineInfo($string)
{
    $this->output->write("<info>$string</info>");
}