显示DatabaseSeeder的Artisian命令输出

时间:2015-01-01 21:55:31

标签: laravel laravel-4

我正在调用一个自定义的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对象传递它。

3 个答案:

答案 0 :(得分:2)

是的,我们可以使用第三个参数进行输出。 BufferedOutput就是您所需要的。它扩展了实现OutputInterface的Output类。所以你可以使用这个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
        }
    }

答案 1 :(得分:2)

如果您希望在输出实际生成时将输出写入控制台/终端,您可以通过调用以下方式使用播种机OutputInterface

$this->command->getOutput();

如果您希望在迁移中使用长时间运行的命令(而不是在命令运行时锁定控制台,那么显示ProgressBar或类似的内容可能会很好),这非常有用)。

示例:

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

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

答案 2 :(得分:2)

更正这一点,因为这仍然是Google在许多相关搜索中的最佳结果。

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

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