显示来自 DatabaseSeeder 的 Artisian 命令输出

Display Artisian command output from DatabaseSeeder

我正在调用自定义 Artisan 命令,该命令通常在运行时显示输出。但是,当从 DatabaseSeeder 调用时,默认情况下不共享接口,因此不显示任何输出。有没有办法将控制台输出接口从DatabaseSeeder传递到Artisan:call

如果示例更适合您:

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,我不确定我是否可以从 Seeder 对象传递它。

是的,我们可以使用第三个参数进行输出。 BufferedOutput 是您所需要的。它扩展了实现 OutputInterface 的 Output class。所以你可以使用这个 BufferedOutput class 实例。

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
        }
    }

如果您希望在实际生成输出时将输出写入 console/terminal,您可以使用播种机自己的 OutputInterface,方法是调用:

$this->command->getOutput();

如果您希望在迁移中使用一个长 运行 命令,这将非常有用(而不是在命令运行时锁定控制台,显示一个 ProgressBar 或类似的)。

示例:

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

这将使命令使用与播种器相同的缓冲区进行输出。

更正此问题,因为在许多相关搜索中,这仍然是 Google 中的最高结果。

从 Laravel 5.4 开始,Artisan::call() 现在像以前一样接受包含输出实例的第三个参数。

来源:https://github.com/laravel/framework/issues/16763#issuecomment-268837505