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

Laravel: Show output of a console command inside a migration?

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

为了自动化并减少人为错误,我想使用 programmatically-executing-commands 样式在 laravel 迁移中调用我的命令并且它有效但问题是它不会打印内部相应命令的任何输出控制台

我认为我应该将 artisan:migrate 正在使用的当前输出缓冲区传递给 Artisan::call 函数以使其工作,但没有运气在迁移中访问它

有什么建议吗?

你可以使用Symfony提供的ConsoleOutput调用Artisan命令后在控制台打印出来。确保在你想要的 .php 文件中使用它 use Symfony\Component\Console\Output\ConsoleOutput;.

你可以有这样的东西:

$output = new ConsoleOutput();
$exitCode = Artisan::call('your call');
if ($exitCode == -1)
    $output->writeln("<bg=red;options=bold>Error occured while migration rollback " . "Exit code: " . $exitCode ."</>");
else {
    $output->writeln("<bg=blue;options=bold>Rollbacked successfully! Exit code: " . $exitCode ."</>");
}

请参阅我的示例,您还可以为文本添加颜色,这可能有助于更好地显示错误和成功,请在此 link 查看更多信息:https://symfony.com/search?q=ConsoleOutput

扩展 Artisan::call 方法具有以下签名:

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

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

这是一个例子:

<?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);
    }
}