2015-01-01 2 views
2

Я вызываю пользовательскую команду Artisan, которая обычно выводит вывод при запуске. Однако при вызове от DatabaseSeeder интерфейс по умолчанию не разделяется, поэтому вывод не выводится. Есть ли способ передать интерфейс интерфейса консоли от DatabaseSeeder до Artisan:call?Отображает вывод команды Artisian из DatabaseSeeder

Если примеры более ваша вещь:

class DatabaseSeeder extends Seeder { 
    public function run() { 
    Eloquent::unguard(); 
    $this->call('ApplicationsSeeder'); 
    foreach(Config::get('app.steam_appids') as $appid) { 
     Artisan::call('schema:update', array('appid' => $appid)); // No output :(
    } 
    ... 

Artisan::call может принимать третий аргумент, но он должен реализовать Symphony\Component\Console\Output\OutputInterface, и я не уверен, если я могу передать, что из объекта сеялки.

ответ

2

Исправление, поскольку это все еще главный результат в Google для многих связанных поисков.

Начиная с Laravel 5.4, Artisan::call() теперь принимает третий параметр, содержащий выходной экземпляр, как и ранее.

Источник: https://github.com/laravel/framework/issues/16763#issuecomment-268837505

2

Да, мы можем использовать третий аргумент для вывода. BufferedOutput - это то, что вам нужно. Он расширяет класс Output, который реализует OutputInterface. поэтому вы можете использовать этот экземпляр класса BufferedOutput.

use Symfony\Component\Console\Output\BufferedOutput; 

class DatabaseSeeder extends Seeder { 

    public function run() 

    { 
     Eloquent::unguard(); 
     $output = new BufferedOutput; // instance 
     $this->call('ApplicationsSeeder'); 

     foreach(Config::get('app.steam_appids') as $appid) { 
      Artisan::call('schema:update', array('appid' => $appid), $output); 
      $output->fetch(); // returns content 
     } 
    } 
+0

Это не работает в Laravel 5; похоже, что аргумент $ output для 'Artisan :: call()' удален. У кого-нибудь есть обходной путь? – sgtdck

+0

Yay, решил. 'Artisan :: output()' возвращает результат последней управляемой команды artisan. Поэтому после выполнения 'Artisan :: call (...)' вы можете сделать '$ this-> command-> info (Artisan :: output());', чтобы показать результат. – sgtdck

1

Если вы хотите выход для записи на консоли/терминал, а выход фактически производятся, вы можете использовать сеялки собственный OutputInterface по телефону:

$this->command->getOutput(); 

Это может быть весьма полезным если у вас есть длинная команда, которую вы хотите использовать в процессе миграции (вместо того, чтобы заблокировать консоль во время выполнения команды, было бы неплохо отобразить ProgressBar или подобное).

Пример:

Artisan::call('command:longrunningcommand', array(), $this->command->getOutput()); 

Это заставит команду использовать один и тот же буфер, как сеялка для вывода.

Смежные вопросы