2016-05-19 2 views
6

Я должен засеять довольно много данных в базу данных, и я хочу показать пользователю индикатор выполнения, пока это происходит. Я знаю, что это документально:Использование полосы прогресса при посеве базы данных в Laravel

но у меня возникают проблемы, в том числе это в моем сеялке.

<?php 

use Illuminate\Database\Seeder; 

class SubDivisionRangeSeeder extends Seeder 
{ 
    public function run() 
    { 
     $this->output->createProgressBar(10); 
     for ($i = 0; $i < 10; $i++) { 
      sleep(1); 
      $this->output->advance(); 
     } 
     $this->output->finish(); 
    } 
} 

или

<?php 

use Illuminate\Database\Seeder; 

class SubDivisionRangeSeeder extends Seeder 
{ 
    public function run() 
    { 
     $this->output->progressStart(10); 
     for ($i = 0; $i < 10; $i++) { 
      sleep(1); 
      $this->output->progressAdvance(); 
     } 
     $this->output->progressFinish(); 
    } 
} 

из https://mattstauffer.co/blog/advanced-input-output-with-artisan-commands-tables-and-progress-bars-in-laravel-5.1

Любые идеи?

ответ

1

Ваш код не работает, потому что вы используете $this->output в неправильном классе. Если вы снова взглянете на статью, которую вы поделили, $this-output используется в командном классе Artisan.

Фактически каждая команда Artisan выполнена с компонентом Symfony Console.

Вы на самом деле пытается использовать его в сеялке базы данных :)

Мое предложение: построить свой сеялок, а затем вызвать их с помощью «Установить» или «семени» настраиваемой команды для ваших нужд.

+0

да, но настроенная команда не чтобы узнать, где сеялка находится в цикле посевных данных, чтобы увеличить индикатор выполнения. – Sevenearths

+0

Конечно, вам нужно создать что-то более сложное, нормальной сеялки будет недостаточно :) –

22

Вы можете получить доступ к выходу через $this->command->getOutput()

public function run() 
{ 
    $this->command->getOutput()->progressStart(10); 
    for ($i = 0; $i < 10; $i++) { 
     sleep(1); 
     $this->command->getOutput()->progressAdvance(); 
    } 
    $this->command->getOutput()->progressFinish(); 
} 
+2

Это здорово, что вы не даже нужна ваша собственная команда мастеров. Просто отбросьте это, и это сработает. Благодарю. @Sevenearths, вероятно, это ваш ответ, поскольку он делает именно то, что у вас было в вашем примере, даже не требуя специальной команды. – mtpultz

+1

Это должен быть ответ –

0

Только в случае, если кто-то идет по схожему сценарию и ищет решение, которое я создал следующий базовый класс:

<?php 

use Illuminate\Database\Schema\Blueprint; 

class TestCase extends Illuminate\Foundation\Testing\TestCase 
{ 
    protected $progress = 0; 

    protected function outputInfo($text) 
    { 
     $this->output('info', $text, 34); 
    } 

    protected function outputSuccess($text) 
    { 
     $this->output('success', $text, 32); 
    } 

    protected function outputWarning($text) 
    { 
     $this->output('warning', $text, 33); 
    } 

    protected function outputError($text) 
    { 
     $this->output(strtoupper('error'), $text, 31); 
    } 

    private function output($status, $text, $colour_code = 34) 
    { 
     $this->newLine(); 
     print "\033[1;" . $colour_code . "m" . str_pad($status.':', 8) . " " . $text . " \033[0m"; 
    } 

    protected function progressDots() 
    { 
     if ($this->progress % 20 == 0) { 
      print '.'; 
     } 
    } 

    protected function newLine() 
    { 
     echo "\n"; 
    } 

    /** 
    * Prevents a warning on the command line 
    */ 
    public function testDefault() 
    { 
     $this->assertTrue(true); 
    } 
} 

И затем использовал его что-то вроде этого ...

<?php 

class SomethingTests extends TestCase 
{ 

    public function testSomething() 
    { 
     $array = range(0, 100); 

     foreach ($array as $value) { 

      $this->outputInfo('Testing '.$value); 

      $this->assertGreaterThan(101,$value,'101 is not greater then '.$value); 

      $this->progressDots(); 

     } 

     $this->newLine(); 

    } 

}