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

Chr*_*her 11 php symfony laravel artisan laravel-5.1

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

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

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

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

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

$this->output->progressFinish();
Run Code Online (Sandbox Code Playgroud)

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

PHP Fatal error:  Call to undefined method Illuminate\Console\OutputStyle::setFormat()
Run Code Online (Sandbox Code Playgroud)

Raf*_*kel 22

$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()来救援!

但是,有一个很酷的未记录方法createProgressBar($max),它会返回一个你可以玩的闪亮的全新ProgressBar对象.

所以,你可以这样做:

$progress = this->output->createProgressBar(100);
Run Code Online (Sandbox Code Playgroud)

并使用您提供的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();
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.;)