2015-08-14 173 views
5

我想作为提供Laravel docs相同的例子上的消息:Laravel 5.1 - 如何设置进度条

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

回答

13

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

progressStart()方法动态创建Symfony\Component\Console\Helper\ProgressBar对象的实例,并将其添加到您的输出对象,这样你就可以使用progressAdvance()progressFinish()操纵它。

可惜的是,Symfony的家伙决定保留两个$progressBar财产和getProgressBar()方法为私有,所以直接通过您的输出对象,如果你使用progressStart()启动它,你不能访问的实际进度情况。

createProgressBar()来拯救!

但是,有一种非常酷的未记录方法,称为createProgressBar($max),它返回一个闪亮的全新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(); 

希望它有帮助。 ;)

+0

完美答案! – Christopher

+0

我收到错误'调用未定义的方法UsersTableSeeder :: info()'和'未定义的属性:UsersTableSeeder :: $ output'。什么即时做错了? – kuchar