2015-08-14 10 views
5

sto cercando lo stesso esempio fornito sul Laravel docs:laravel 5.1 - Come impostare un messaggio sulla barra di avanzamento

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

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

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

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

$this->output->progressFinish(); 

E questo funziona bene. Voglio personalizzare la barra di avanzamento (vedi this), ma dà $this->output->setMessage('xpto');:

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

risposta

13

L'oggetto $this->output è un'istanza di Symfony di Symfony\Component\Console\Style\SymfonyStyle, che fornisce i metodi progressStart(), progressAdvance() e progressFinish().

Il metodo progressStart() crea dinamicamente un'istanza di Symfony\Component\Console\Helper\ProgressBar oggetto e lo aggiunge al vostro oggetto di uscita, in modo da poter manipolare usando progressAdvance() e progressFinish().

Purtroppo, ragazzi Symfony ha deciso di mantenere sia $progressBar proprietà e getProgressBar() Metodo privato, quindi non è possibile accedere all'istanza ProgressBar reale direttamente tramite il vostro oggetto di output se è stato utilizzato progressStart() per avviarlo.

createProgressBar() per il salvataggio!

Tuttavia, esiste un metodo non documentato chiamato createProgressBar($max) che restituisce un oggetto ProgressBar nuovo di zecca lucido con cui si può giocare.

Così, appena si può fare:

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

E fare quello che vuoi con esso utilizzando la pagina Symfony's docs che hai fornito. Ad esempio:

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

Spero che sia d'aiuto. ;)

+0

Risposta perfetta! – Christopher

+0

ottengo errore 'Chiama a metodo non definito UsersTableSeeder :: info()' e 'Proprietà indefinita: UsersTableSeeder :: $ output'. Cosa sto facendo male? – kuchar