Laravel Artisan 命令行:简单的闭包命令
简单的闭包命令
除了通过创建命令类的方式来实现自定义 Artisan 命令外,在 Laravel 中还有一种更简便的创建命令的方式——闭包命令。相比创建命令类,闭包命令不用创建新的类文件,而是直接在项目根目录的 routes/console.php
文件中创建新的命令,这种方式特别适合创建比较简单的命令。
现在我们来看下 routes/console.php
这个文件的内容:
<?php
use Illuminate\Foundation\Inspiring;
/*
|--------------------------------------------------------------------------
| Console Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of your Closure based console
| commands. Each Closure is bound to a command instance allowing a
| simple approach to interacting with each command's IO methods.
|
*/
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->describe('Display an inspiring quote');
文件中已经包含了一个 inspire
命令,这个命令会随机显示一条励志名言。
$ php artisan inspire
Simplicity is an acquired taste. - Katharine Gerould
可以看到,inspire
命令是通过 Artisan::command
方法定义的。这个方法接受两个参数:第一个参数是个字符串,用于指明命令名、命令参数、命令选项,其作用相当于命令类中的 signature
属性。第二个参数是个闭包函数,包含实际的命令逻辑代码。要设置命令的描述信息可通过链式调用命令的 describe
方法。
下面,我们以闭包命令的方式来创建一个简单的计算文本 MD5 哈希值的命令。
我们给命令取名为 hash:md5
,它接受一个 text
参数,指明要求 MD5 哈希值的文本,还支持 -U
或 --uppercase
选项来输出大写的 MD5 哈希值。
在 routes/console.php
文件底部添加以下代码:
Artisan::command('hash:md5 {text} {--U|uppercase}', function () {
$text = $this->argument('text');
$uppercase = $this->option('uppercase');
$md5text = $uppercase ? strtoupper(md5($text)) : md5($text);
$this->info("md5('{$text}') = $md5text");
})->describe('Calculate the md5 hash of a text');
由于闭包绑定到底层命令实例,因此我们象在命令类中那样完全地访问所有的辅助方法。
命令参数、选项直接作为闭包函数参数传递,所以我们可以进一步修改:
Artisan::command('hash:md5 {text} {--U|uppercase}', function ($text, $uppercase) {
$md5text = $uppercase ? strtoupper(md5($text)) : md5($text);
$this->info("md5('{$text}') = $md5text");
})->describe('Calculate the md5 hash of a text');
是不是更简洁了?
最后,看看刚创建的命令的执行效果:
计算 hello world
的 MD5 哈希值:
$ php artisan hash:md5 "hello world"
md5('hello world') = 5eb63bbbe01eeed093cb22bb8f5acdc3
输出大写形式的 hello world
的 MD5 哈希值:
$ php artisan hash:md5 "hello world" -U
md5('hello world') = 5EB63BBBE01EEED093CB22BB8F5ACDC3
推荐文章: