问题
除了在终端中执行一个 Artisan 命令,我可以在代码中调用一个 Artisan 命令么(比如,在路由或控制器里触发 Artisan 命令)?
解答
Artisan 门面的 call 方法
要想在代码中调用一个 Artisan 命令,可以使用 Artisan 门面的 call 方法。call 方法的第一个参数接受命令名,第二个参数接受数组形式的命令参数。返回的是命令执行的退出码:
Route::get(‘/foo’, function () {
$exitCode = Artisan::call(’email:send’, [
‘user’ => ‘zhangsan’, ‘–queue’ => ‘default’
]);
});
传递数组值
对于数组参数或数组选项,可以直接传递数组值:
Route::get(‘/foo’, function () {
$exitCode = Artisan::call(’email:send’, [
‘user’ => [‘zhangsan’, ‘lisi’], ‘–id’ => [5, 13]
]);
});
传递布尔值
开关选项可以传入 true 或 false,例如,migrate:refresh 命令的 –force 选项:
$exitCode = Artisan::call(‘migrate:refresh’, [
‘–force’ => true,
]);
整体传递
在 Laravel 5.8 中,你也可以将整个命令作为字符串传递给 call 方法:
Artisan::call(’email:send zhangsan –queue=default’);
参考
程序调用命令