我正在try Laravel docs上提供的相同示例:

$users = App\User::all();

$this->output->progressStart(count($users));

foreach ($users as $user) {
    print "$user->name\n";

    $this->output->progressAdvance();
}

$this->output->progressFinish();

这很有效.我想自定义进度条(请参见this),但$this->output->setMessage('xpto');提供:

PHP Fatal error:  Call to undefined method Illuminate\Console\OutputStyle::setFormat()

推荐答案

Note:因为Laravel 5.5,你应该使用$this->command->getOutput()而不是$this->output.

$this->output对象是Symfony Symfony\Component\Console\Style\SymfonyStyle的一个实例,它提供了方法progressStart()progressAdvance()progressFinish().

progressStart()方法动态创建Symfony\Component\Console\Helper\ProgressBar对象的一个实例,并将其附加到输出对象中,因此可以使用progressAdvance()progressFinish()对其进行操作.

不幸的是,Symfony的家伙们决定将$progressBar属性和getProgressBar()方法都保留为私有,因此如果使用progressStart()启动,就无法通过输出对象直接访问实际的ProgressBar实例.

createProgressBar() to the rescue!

然而,有一个很酷的未记录方法称为createProgressBar($max),它会返回一个shiny 的全新ProgressBar对象,供您使用.

所以,你可以这样做:

$progress = this->output->createProgressBar(100);

用你提供的Symfony's docs页做任何你想做的事.例如:

$this->info("Creating progress bar...\n");

$progress = $this->output->createProgressBar(100);

$progress->setFormat("%message%\n %current%/%max% [%bar%] %percent:3s%%");

$progress->setMessage("100? I won't count all that!");
$progress->setProgress(60);

for ($i = 0;$i<40;$i++) {
    sleep(1);
    if ($i == 90) $progress->setMessage('almost there...');
    $progress->advance();
}

$progress->finish();

希望有帮助

Laravel相关问答推荐

发送邮箱后,Laravel重定向偶尔会导致错误500

vagrant会损坏你的电脑. | macOS v12(蒙特雷)#13132

我如何通过 laravel 在高图中针对不同的时间范围进行烛台数据分组

调用字符串上的成员函数

不能在 laravel 中使用控制器名称,必须使用命名空间

如何在laravel中输出奇偶行

找不到 Laravel 5 类日志(log)

指令allow_call_time_pass_reference警告

Lumen和 MongoDB?

磁盘 [视频] 没有配置的驱动程序

Laravel Request::input 调用未定义的方法

Laravel 4:读取由 javascript 设置的 cookie

不支持驱动Driver[] - Laravel 5.3

如何在 Laravel 5.5 中为选定的请求类设置自定义响应

Http请求多浏览器的烦恼

Laravel 5:在同一字符串上使用 bcrypt 给出不同的值

如何在 laravel 中使用 GROUP_CONCAT

在我的编辑器中管理上传文件的最佳方式?

无法在控制器的构造函数上调用 Auth::user()

如何从 PHPUnit 测试设置运行 Laravel 数据库 seeder 机?