Получите ответ от вызова Artisan

Когда я запускаю в терминале php artisan migrate, это приводит к тому, что "Nothing to migrate" не работает, когда нечего мигрировать.

Когда я использую Artisan::call('migrate') в коде (используйте это в пользовательской команде Artisan), это не возвращает никакого сообщения. Он просто выполняет код без обратной связи.

Если я vardump() результат метода Artisan::call, он просто возвращает int(0)

Можно ли получить ответ метода вызова Artisan?

Ответ 1

Результат возврата всех команд определяется в классе Symfony\Component\Console\Command\Command, method run:

return is_numeric($statusCode) ? (int) $statusCode : 0;

Переменная $statusCode задается вызовом метода execute команды, который в ремесленном случае определяется в классе Illuminate\Console\Command:

protected function execute(InputInterface $input, OutputInterface $output)
{
    return $this->fire();
}

Результат метода fire оставлен до отдельных команд, в случае команды php artisan migrate ничего не возвращается из метода, поэтому $statusCode имеет значение null (поэтому вы получаете 0 возвращенных из метода Symfony\Component\Console\Command\Command::run)

Если вы хотите получить ответ от пользовательской команды, просто верните целое число из вашего метода fire, и он будет пузыриться обратно в $statusCode. Вы можете использовать это для программного переключения на разные результаты своей пользовательской команды.

Если вы специально хотите получить результат из команды artisan:migrate, то я не думаю, что вы можете многое сделать, чтобы изменить возвращаемое значение, кроме того, чтобы обернуть команду в вашей собственной пользовательской команде, которая ее вызывает.

Ответ 2

Для меня с Laravel 5.1 все это не сработало, но вы можете просто использовать:

Artisan::output()

Ответ 3

Я могу получить результат Artisan:: call() с помощью следующего:

use Symfony\Component\Console\Output\StreamOutput;

$stream = fopen("php://output", "w");
Artisan::call("migrate", array(), new StreamOutput($stream));

var_dump($stream);

Ответ 4

Да, это возможно. Чтобы получить результат встроенной команды artisan из пользовательской команды, передайте OutputStream из вашей команды в Artisan::call. Пример:

class MyCommand extends \Illuminate\Console\Command
{
    public function fire()
    {
        \Artisan::call('optimize', [], $this->getOutput());
    }
}

Ответ 5

Позднее, но может быть полезно для кого-то, кто ищет вариант использования.

Позвольте мне добавить, как я это сделал в своих тестах для вывода результатов на консоль. моя проблема заключалась в печати вывода, в то время как тесты выполняли миграции. я использовал модули и хотел увидеть результаты процесса миграции.

$this->artisan('module:migrate');
//same as running php artisan module:migrate or
// $this->app['Illuminate\Contracts\Console\Kernel']->call('module:migrate');

echo $this->app['Illuminate\Contracts\Console\Kernel']->output();