Laravel 中的自定义命令 - Command

简介

  • 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 linhaiphp 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
  • 里面包括进度条,命令行间调用等,完全可以满足大多数的需求。

你可能感兴趣的:(Laravel 中的自定义命令 - Command)