Laravel进阶系列笔记--(十三)Laravel 复杂的自定义artisan命令的使用

作者: 温新

分类: 【Laravel】

阅读: 2429

时间: 2021-08-24 15:02:10

作者:温新

时间: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' => '湖北',
    ]);
});

然后在路由中访问就行了。

我是温新

每天进步一点点,就一点点

请登录后再评论