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

问题描述 投票:0回答:4

我想使用一系列简单的点来显示处理进度。这在浏览器中很容易,只需执行

echo '.'
,它就会在同一行上,但是当将数据发送到 artisan 命令行时,如何在同一行上执行此操作?

随后每次调用

$this->info('.')
都会将该点放在新行上。

php laravel laravel-4
4个回答
26
投票

方法info使用了writeln,它在末尾添加了换行符,您需要使用write来代替。

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

20
投票

可能是一点主题,因为您只想要一系列点。但是您可以使用 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->progressbar->finish();

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

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

11
投票

如果你查看源代码,你会发现

$this->info
实际上只是
$this->output->writeln
的快捷方式:Source

您可以使用

$this->output->write('<info>.</info>')
使其内联。

如果您发现自己经常使用此方法,您可以制作自己的辅助方法,例如:

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

0
投票

是回车
是换行符

所以你可以使用:

echo "something\r";
例如,在同一行中写入以显示进度。之后您可以致电“ |

© www.soinside.com 2019 - 2024. All rights reserved.