Laravel, вызовите много команд ремесленника с выводом индикатора выполнения - PullRequest
0 голосов
/ 17 марта 2020

Я создал простую черту для генерации индикатора выполнения во время выполнения команд.

    <?php

    namespace App\Console\Commands;

    trait ProgressBarOutput
    {
        public function runProcess(\Countable $countable, callable $callback)
        {
            $bar = $this->output->createProgressBar(count($countable));
            $bar->start();
            foreach ($countable as $item) {
                call_user_func($callback, $item);
                $bar->advance();
            }
            $bar->finish();
            $this->line('');
        }
    }

Это работает внутри моей страницы команд:

<?php

namespace App\Console\Commands;

use App\Console\Commands\ProgressBarOutput;
use Illuminate\Console\Command;

class MigrateUsers extends Command
{
    use ProgressBarOutput;

    protected $signature = 'migrate:users';
    protected $description = 'Migrate users table from old to new';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $this->info("users");
        $rows = \DB::connection('old')->table('users')->get();
        $this->runProcess($rows, function($row) {
            \DB::connection('mysql')->table('users')->insert([
                'id' => $row->id,
                'name' => $row->name,
                'surname' => $row->surname,
            ]);
        });

        $this->info("cars");
        $rows = \DB::connection('old')->table('cars')->get();
        $this->runProcess($rows, function($row) {
            \DB::connection('mysql')->table('cars')->insert([
                'id' => $row->id,
                'model' => $row->model,
            ]);
        });
    }
}    

Проблема возникает, когда я пытаюсь чтобы разделить эти микроимпорты на отдельные файлы, затем объединить их:

public function handle()
{
    \Artisan::call("migrate:users");
    \Artisan::call("migrate:cars");
}

Команды вызываются правильно, но не выводятся выходные данные и индикатор выполнения. Вы когда-нибудь сталкивались с такой проблемой?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Я решил проблему.

Просто вызовите $ this-> call ("your-command"); вместо \ Artisan :: call ("ваша команда");

public function handle()
{
    $this->call("migrate:users");
    $this->call("migrate:cars");
}
0 голосов
/ 17 марта 2020
Команда

migrate требует от пользователя подтверждения продолжения процесса. Добавление --no-interaction вместе с вызовом удалит все взаимодействия с пользователем. В этом примере это будет похоже на

public function handle()
{
    \Artisan::call("migrate:users --no-interaction");
    \Artisan::call("migrate:cars --no-interaction");
}
...