Laravel Artisan 命令行:代码里调用命令
问题
除了在终端中执行一个 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');
怎么获取command的返回值,比如 route:list