Laravel Artisan 命令行:简单的闭包命令 1 个改进

简单的闭包命令

除了通过创建命令类的方式来实现自定义 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

参考

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!