Laravel:在迁移中显示控制台命令的输出吗?

时间:2020-06-04 17:19:28

标签: laravel laravel-artisan artisan-migrate

我创建了一个命令来对非常大的数据库表进行一些数据操作,并且由于花费了足够的时间来完成操作,所以我利用了进度条的好处以及在控制台上回显一些信息。

要自动执行操作并减少人为错误,我想使用programmatically-executing-commands样式在laravel迁移中调用我的命令,它可以工作,但问题是它不会在控制台内打印相应命令的任何输出

我认为我应该将artisan:migrate所使用的当前Output-buffer传递给Artisan::call函数,以使其正常工作,但是在迁移过程中没有运气访问它

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

@ettdro's answer上扩展后,Artisan::call方法具有以下签名:

Artisan::call(string $command, array $parameters = [], $outputBuffer = null);

如您所见,该方法接受输出缓冲区作为其第3个参数。您可以将该输出缓冲区传递给该方法,命令日志将显示在控制台上。

这是一个例子:

<?php

use App\Console\Commands\YourConsoleCommand;
use Illuminate\Database\Migrations\Migration;
use Symfony\Component\Console\Output\ConsoleOutput;


class SomeDbMigration extends Migration
{
    public function up()
    {
        $output = new ConsoleOutput();
        Artisan::call(YourConsoleCommand::class, ['--some-option' => true], $output);
    }

    public function down()
    {
        $output = new ConsoleOutput();
        Artisan::call(YourConsoleCommand::class, ['--some-option' => false], $output);
    }
}


答案 1 :(得分:1)

您可以在调用Artisan命令后使用Symfony提供的public static在控制台中打印出来。确保像所需的ConsoleOutput这样在所需的.php文件中使用它。

您可能会遇到这样的事情:

use Symfony\Component\Console\Output\ConsoleOutput;

在我的示例中,您还可以在文本中添加颜色,这对于使错误和成功具有更好的视觉效果很有用,请参见以下链接:https://symfony.com/search?q=ConsoleOutput