7.2. 命令例子

在这章节里面我们向你展示如何开发一个简单的命令行程序,代码在这里 下载

这里下载的代码解压缩得到 Example1.php ,把这个文件放到 src/console/Command 目录下面,然后执行 php Clip 你应该就能看到列表中有这个命令出现了。现在执行这个命令看一下输出结果 php Clip Exampl1 goods_id=42107(注意,请在 Linux 下执行,程序输出为 UTF-8 编码,如果你的显示为乱码说明你的执行终端不是 UTF-8 编码的,例如你的 SSH 配置的是使用 GBK 编码)。

Example1.php. 

<?php

/**
 * @author QiangYu
 *
 * 这是一个命令行例子
 */

use Core\Helper\Utility\Validator;
use Core\Service\Goods\Goods as GoodsBasicService;

class Example1 implements \Clip\Command
{

    public function run(array $params)
    {

        global $f3;

        $errorMessage = '';

        // 首先验证输入参数
        $validator = new Validator($params);
        $goods_id  = $validator->required()->digits()->min(1)->validate('goods_id');

        if ($validator->hasErrors()) {
            // 有错误,拼接错误消息
            $errorArray = $validator->getAllErrors();
            foreach ($errorArray as $errorField => $errorMsg) {
                $errorMessage .= '[' . $errorField . '] ' . $errorMsg . "\n";
            }

            goto out_fail;
        }

        // 使用 Core 中的业务逻辑
        $goodsBasicService = new GoodsBasicService();
        $goods             = $goodsBasicService->loadGoodsById($goods_id);

        if ($goods->isEmpty()) { // 商品不存在
            $errorMessage = 'invalid goods_id [' . $goods_id . ']';
            goto out_fail;
        }

        // 显示查询结果
        printLog('query goods_id [' . $goods_id . '] title [' . $goods['goods_name'] . ']');

        return; // 成功从这里返回

        out_fail: // 出错这里退出
        printLog($errorMessage);
    }

    public function help()
    {
        $usage = <<<MSG

Example1 Command Usage :
php Clip Example1 goods_id=42107

MSG;

        echo $usage;
    }
}

首先看到,命令实现了 implements \Clip\Command 接口,这个是我们使用的 Clip 框架要求的接口。这个接口很简单,定义了一个 run() 方法和一个 help() 方法。用户如果执行 php Clip help Example1 ,help 指明调用 help() 方法,于是就会打印命令帮助。

run() 是命令主要的逻辑实现,在这里我们首先调用 Validator 做参数的合法性验证,如果参数非法就跳转到 out_fail 打印错误消息。 接下来我们在命令中直接调用 Core 中的业务逻辑 GoodsBasicService 查找商品数据,然后打印商品标题。这里我们可以看出,命令中可以使用几乎和 Web 一样的所有业务逻辑,你没必要再另外弄一套了,大大提高了代码的可重复利用率,减轻了命令开发的工作量。

最后一点提示,我们输出采用的是 printLog() 方法,这样的好处是我们所有的命令输出都同时会输出到 log 文件中(protected/Runtime 下),如果你发现有问题,还可以到 log 文件中去查看历史结果。