Laravel进阶系列笔记--(十三)Laravel 复杂的自定义artisan命令的使用
作者:温新
时间:2021-07-10
hi,我是温新,一名PHPer。
了解了编写一个简单的自定义artisan
命令后,有没有疑问?复杂的artisan
命令可以携带参数、选项等,这些就是本篇的内容。
自定义artisan的参数和选项
命令参数与选项
通过上篇文章,应该对artisan
自定义命令有了一个基础的了解了。自定义命令通过$signature
属性定义,在这里还可以为自定义命令添加参数与选项,格式如下:
protected $signature = 'demo:msg {name:自如初,我是默认值}'
{--create= :create table}
artisan参数
必填参数
demo:msg {name}
可选参数
demo:msg {name?}
**默认值 **
demo:msg {name=自如初}
选项
需要注意的是,选择使用的前缀是--
两个横杠,选项需要使用{}
包裹。
基础选项
demo:msg {name} {--table}
带值选项,用户必须设置选项值
demo:msg {name} {--table=}
设置选项默认值
demo:msg {name} {--table=users}
选项所写
所写,使用|
将缩写和完整的选项名分开
demo:msg {name} {--T|table}
数组参数与选项
无论是数组还是选项,接收数组作为参数时,都使用*
通配符
demo:msg {name*} {--table*}
接收参数值与选项值
既然可以定义参数和选项,那么必然就可以接收他们的值。在使用携带参数的artisan命令前,先来了解下如何接收参数吧。
自定义命令类中可以使用argument
方法接收参数值;使用option
方法接收选项值。
接收参数值
// 接收所有参数值
$this->argument();
// 接收指定的参数值
$this->argument('name');
接收选项值
// 接收所有选项值
$this->option();
// 接收指定的选项值
$this->option('provinces');
使用携带参数的artisan命令
现在来改造DemoCommand
类,为自定义artisan命令加上参数。
第一步:改造自定义命令
文件:app/Console/Commands/DemoCommand.php
// 携带默认值的选项
protected $signature = 'demo:msg {name : 用户名} {--provinces=湖北}';
第二步:改造handle方法,接收参数
public function handle()
{
Log::info('接收参数的自定义artisan命令。' . $this->argument('name') . $this->option('provinces'));
}
第三步:执行指定义命令
// 不携带选项值
php artisan demo:msg 我是温新 --provinces
// 携带选项值
php artisan demo:msg 我是温新 --provinces=重庆
用户交互
除了设置固定的参数值和选项值外,Artisan还可以跟用户进行互动,由用户输入相关值。Artisan 提供了多种方法支持用户输入不同的数据值。
ask()普通文本
$userName = $this->ask('你叫啥?');
secret()敏感信息
如密码等需要隐藏
$password = $this->secret('请输入密码');
confirm()确认信息
if ($this->confirm('确定执行吗?')) {}
anticipate()自动提示
$city = $this->anticipate('你在哪个城市?', ['北京','上海','深圳']);
choice()选择
$city = $this->choice('你在哪个城市?',['北京','上海','深圳'],0);
第三个参数为数组下标,默认0,也就是将默认值设置为北京。
使用用户交互
来新建一个命令类作为演示。
第一步:创建自定义artisan命令类
php artisan make:command UserArtisanCommand --command=user:demo
第二步:修改方法
文件:app/Console/Commands/UserArtisanCommand.php
public function handle()
{
$userName = $this->ask('你是?');
$provinces = $this->choice('你在哪?',['北京','上海']);
$password = $this->secret('请输入密码');
if ($password != '123456') {
$this->error('密码错误');
exit(-1);
}
if ($this->confirm('确定执行吗?')) {
$this->info('我是 ' . $userName . ' ,我来自 ' . $provinces);
}
}
建议一行一行来测试。
其他方法
$this->info()
会在当前终端以绿色文本输出内容;
$this->error()
会在当前终端以红色文本输出内容;
$this->line()
无颜色输出信息;
$this->comment()
以黄色文本输出注释信息;
this->question()
以蓝色输出问题。
图表形式输出信息
改造UserArtisanCommand.php
中的方法
第一步:改造方法
public function handle()
{
$headers = ['姓名', '省/市'];
$data = [
['张三', '北京'],
['李四', '上海']
];
$this->table($headers, $data);
}
第二步:执行
php artisan user:demo
进度表
第一步:改造方法
public function handle()
{
$totalUnits = 10;
$this->output->progressStart($totalUnits);
$i = 0;
while ($i++ < $totalUnits) {
sleep(3);
$this->output->progressAdvance();
}
$this->output->progressFinish();
}
第二步:执行
php artisan user:demo
控制器中使用artisan命令
除了在终端执行外,还可以在控制器中使用Artisan
门面使用它们。通过Artisan::call()
方法来调用。
方法:call(参数一,参数二)
参数一:artisan命令名称;
参数二:以数组形式传递参数和选项
控制器使用
为了快速测试,这里直接在路由中进行测试。
// web.php
Route::get('artisan', function(){
\Illuminate\Support\Facades\Artisan::call('demo:msg',[
'name' => '自如初',
'--provinces' => '湖北',
]);
});
然后在路由中访问就行了。
我是温新
每天进步一点点,就一点点