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

Когда я запускаю терминал php artisan migrate, это приводит к «Нечего мигрировать», хотя на самом деле мигрировать нечего.

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

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

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


person cenob8    schedule 18.03.2014    source источник


Ответы (7)


Возвращаемый результат всех команд определяется в классе Symfony\Component\Console\Command\Command, метод 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, то я не думаю, что вы можете многое сделать, чтобы изменить возвращаемое значение, кроме как обернуть команду в свою собственную пользовательскую команду, которая ее вызывает.

person Jeff Lambert    schedule 18.03.2014
comment
Причина, по которой Symfony делает это, заключается в том, как работают системы, подобные Unix и Unix. Если команда возвращает 0, это означает, что она прошла успешно, а если она возвращает любое другое число, это означает, что она не удалась, и конкретное число соответствует коду состояния, который может быть или не быть частью ее общедоступного API. Я не уверен, что должно произойти, если ответ не является целым числом, но я думаю, что либо поведение не определено, либо система должна вести себя так, как если бы команда вернула 0. - person trysis; 29.06.2016
comment
@trysis Если вы вернете строку или массив, результатом будет 0 - person bumerang; 16.03.2020

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

Artisan::output()
person PiTheNumber    schedule 12.01.2016
comment
обратите внимание, что это будет перехватывать вывод только в том случае, если вы использовали Artisan::run('') просто b4, в противном случае вы получите пустой вывод, а не вывод всей команды - person ctf0; 08.06.2018

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

use Symfony\Component\Console\Output\StreamOutput;

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

var_dump($stream);
person George Huber    schedule 08.07.2014

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

class MyCommand extends \Illuminate\Console\Command
{
    public function fire()
    {
        \Artisan::call('optimize', [], $this->getOutput());
    }
}
person bishop    schedule 24.10.2014
comment
Простите мое явное невежество в PHP, но что такое обратная косая черта перед вызовом ремесленника? - person trysis; 29.06.2016
comment
@trysis: обратная косая черта полностью определяет пространство имен. Artisan находится в глобальном пространстве имен: MyCommand может и не быть. - person bishop; 29.06.2016

Когда требуемый вывод команды Artisan выдает ошибку echo.

Вы можете получить доступ к этому типу вывода с помощью ob_start и ob_get_clean.

Например, если ваша команда повторяет JSON.

Artisan::command('myecho:command', function () {

    echo json_encode(config('myconfig'), true);

})->describe('outputs json');

Затем вы можете получить доступ к выходным данным JSON, заключив вызов команды в буфер:

\ob_start();
\Artisan::call('myecho:command');
$output = \ob_get_clean();

var_dump($output);
person mfink    schedule 11.03.2019

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

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

$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();
person aimme    schedule 13.09.2017

Возможно, это сэкономит кому-то время в будущем, у меня сработало сочетание двух ответов:

use Symfony\Component\Console\Output\StreamOutput;

$stream = fopen("php://output", "w");
Artisan::call('migrate', [
    '--path' => 'database/migrations/customer',
    '--force' => true,
    '--database' => $connectionName
], new StreamOutput($stream));

$callResponse = ob_get_clean();

StreamOutput помогает поместить ответ в буфер и использовать функции ob для получения ответа.

person Eduardo    schedule 15.01.2021