Laravel - 如何在进度条上设置消息

我正在尝试与Laravel文档中提供的示例相同的示例:

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

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

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

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

$this->output->progressFinish();

这很有效。我想自定义进度条(请参阅此内容),但给出了:$this->output->setMessage('xpto');

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

答案 1

注意:从Laravel 5.5开始,您应该使用代替.$this->command->getOutput()$this->output

该对象是 Symfony 的一个实例,它提供了方法和 。$this->outputSymfony\Component\Console\Style\SymfonyStyleprogressStart()progressAdvance()progressFinish()

该方法动态创建对象的实例并将其追加到输出对象,以便您可以使用 和 操作它。progressStart()Symfony\Component\Console\Helper\ProgressBarprogressAdvance()progressFinish()

不幸的是,Symfony的家伙决定将属性和方法都保持为私有,因此如果您曾经启动过,则无法通过输出对象直接访问实际的ProgressBar实例。$progressBargetProgressBar()progressStart()

创建ProgressBar() 来救援!

但是,有一个很酷的未记录方法,可以返回一个闪亮的全新ProgressBar对象,您可以使用它。createProgressBar($max)

因此,您可以执行以下操作:

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

并使用您提供的Symfony文档页面做任何您想做的事情。例如:

$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();

希望它有帮助。;)


答案 2

推荐