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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32015511/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 12:11:12  来源:igfitidea点击:

Laravel 5.1 - How to set a message on progress bar

phpsymfonylaravellaravel-5.1artisan

提问by Christopher

I'm trying the same example as provided on Laravel docs:

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

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

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

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

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

$this->output->progressFinish();

And this works well. I want to customize the progress bar (see this) but $this->output->setMessage('xpto');gives:

这很有效。我想自定义进度条(见这个),但$this->output->setMessage('xpto');给出:

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

回答by Rafael Beckel

The $this->outputobject is a instance of Symfony's Symfony\Component\Console\Style\SymfonyStyle, which provides the methods progressStart(), progressAdvance()and progressFinish().

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

The progressStart()method dynamically creates an instance of Symfony\Component\Console\Helper\ProgressBarobject and appends it to your output object, so you can manipulate it using progressAdvance()and progressFinish().

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

Unfortunatelly, Symfony guys decided to keep both $progressBarproperty and getProgressBar()method as private, so you can't access the actual ProgressBar instance directly via your output object if you used progressStart()to start it.

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

createProgressBar() to the rescue!

createProgressBar() 来救援!

However, there's a cool undocumented method called createProgressBar($max)that returns you a shiny brand new ProgressBar object that you can play with.

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

So, you can just do:

所以,你可以这样做:

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

And do whatever you want with it using the Symfony's docspage you provided. For example:

并使用您提供的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();

Hope it helps. ;)

希望能帮助到你。;)