简介
- Laravel 的 artisan 命令大家都用过,这次来介绍一下如何生成自己的命令,从而简化常规运营操作。
通过闭包方式注入命令
- 找到 app/routes/console.php 打开并编辑内容如下:
# 新建一个 kami:make username 的命令
Artisan::command('kami:make {username} {--call=Mr}', function ($username, $call) {
echo "Hello {$call} {$username}" ;
echo "\n";
});
-
接下来就可以做个简单的测试
php artisan kami:make --help
然后大致你可以看到红线标注的一些重点信息,就是这么简单。
-
运行这个命令
php artisan kami:make linhai
-
运行这个命令
php artisan kami:make sunny --call=Ms
加上可选参数 --call 发现命令均可以正确表达。
-
可选参数调换顺序 > php artisan kami:make --call=Ms sunny 当然也是没有问题的。
通过 Command 子类实现命令扩展
如果闭包命令方法过多,会造成 console.php 的难以维护,那么接下来将演示如何通过Command 子类扩展artisan 命令,同样非常简单。
-
首先创建一个命令类比如 UpcaseCommand,
php artisan make:command UpcaseCommand
命令行提示创建成功,这时可以检查
app/console/commands/
目录下面会多出一个UpcaseCommand.php
这是创建好的命令模板对象,我们进去简单修改即可。打开 UpcaseCommand.php 文件,我们计划做如下操作
/* 操作:
1、新增一个 kami:upcase words 的命令。
2、给这个命令新增帮助文档。
3、引入这个命令到Larvael 框架中。
4、测试。
*/
namespace App\Console\Commands;
use Illuminate\Console\Command;
class UpcaseCommand extends Command
{
/**
* 这个就是命令名称
*/
protected $signature = 'kami:upcase {words} {--cp=>>}';
/**
* 命令的说明描述
* @var string
*/
protected $description = '这是一个可以把小写英文转换成大写的命令,用于测试。';
protected $words = '';
/**
* 创建命令的构造方法。
* @param string $words 传入的字符参数
* @return void
*/
public function __construct()
{
parent::__construct();
// 将传入的参数类内容部全局。
// $this->words = $words;
}
/**
* 命令的具体执行触发方法
* @return mixed
*/
public function handle()
{
$cp = $this->option("cp");
$words = $this->argument("words");
echo "{$cp} ". strtoupper($words);
echo "\n";
}
}
- 接下来我们通过命令测试一下
php artisan kami:upcase linhai
和php artisan kami:upcase linhai --cp=$
在命令行中完成交互
- 有些情况下一行命令可能无法完全把事儿搞明白,需要不断的通过用户的输入来调整交互内容,对此 Laravel 中的Command 类也做了具体的实现方式。
- 接下来通过一段代码举例,来展示命令交互如何完成,只截取代码片段:
class UpcaseCommand extends Command
{
/**
* 这个就是命令名称,我们简单的修改一下,改成 kami:login
*/
protected $signature = 'kami:login {name}';
/**
..... 其他代码
*/
// 修改这个方法的代码我们来测试命令交互
public function handle()
{
// 获取参数中的用户名
$name = $this->argument("name");
// 提示用户输入邮箱
$email = $this->ask("Hello {$name}, please input your email:");
do {
// 提示用户输入邮箱密码
$password = $this->secret("Please input your password for mail:");
// 密码验证
if ("123456" != $password) {
if ($this->confirm("Password error, do you need some tips?")) {
echo "You can try : 123456\n";
} else {
echo "Failed stop, bey!\n";
break;
}
} else {
echo "Ok done, {$email} already logged bey!\n";
break;
}
}while(true);
}
}
-
跑起来测试一下效果 :
php artisan kami:login linhai
需要注意,命令和选项的区别:
1、命令是 `{name}` ,而选项是 {--name}
2、命令的获取方式是 $this->argument();
3、选项的获取方式是 $this->option();
其他一些关于命令行的要点
- 对此我就不多解释了可以参考文档:https://learnku.com/docs/laravel/5.5/artisan/1314
- 里面包括进度条,命令行间调用等,完全可以满足大多数的需求。