Получите ответ от вызова 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();