用Yii2构建自己的API框架(四、创建命令行应用)

360 阅读1分钟

提示

本教程相关代码托管在Gitee:gitee.com/toshcn/micr…

在根目录创建console目录

console用作存放命令行应用代码目录

cd micro-hau
mkdir console

console目录结构如下:

console/
    - config                    // 命令行应用配置存放目录
        - .gitignore            // Git配置文件
        - bootstrap.php         // 命令行应用预配置文件
        - main.php              // 命令行应用主配置文件
        - main-local.php        // 命令行应用本地环境配置文件
        - params.php            // 命令行应用主参数配置文件
        - params-local.php      // 命令行应用本地环境参数配置文件
    - controllers               // 命令行应用控制器代码存放目录
    - migrations                // 命令行应用数据库迁移代码存放目录
    - runtime                   // 命令行应用运行目录

设置根别名

在common/config目录下的bootstrap.php文件,在文件追加如下内容:

<?php
Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console'); // 追加的内容

创建main.php主配置文件

在console/config目录下,创建main.php文件,在文件内添加如下内容:

<?php
/**
 * @link https://gitee.com/toshcn/micro-hau
 * @copyright Copyright (c) 2022/4/15 micro-hau
 * @author toshcn <toshcn@foxmail.com>
 */

// 合并参数
$params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

return [
    'id' => 'micro_hau_console', // 设置应用ID
    'basePath' => dirname(__DIR__), // console应用根目录
    'bootstrap' => ['log'], // 引导前就加载日志组件
    'controllerNamespace' => 'console\controllers', // 配置console应用的控制器命名空间
    'controllerMap' => [ // 控制器类对应表
        'fixture' => [ // 测试夹具类
            'class' => 'yii\console\controllers\FixtureController',
            'namespace' => 'common\fixtures',
        ],
    ],
    // 配置公共组件
    'components' => [
        // 日志组件
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
    ],
    'params' => $params
];

创建main-local.php本地配置文件

在console/config目录下,创建main-local.php文件,在文件内添加如下内容:

<?php
return [
];

创建params.php公共参数文件

在console/config目录下,创建params.php文件,在文件内添加如下内容:

<?php
return [
];

创建params-local.php本地环境参数文件

在console/config目录下,创建params-locall.php文件,在文件内添加如下内容:

<?php
return [
];

创建yii命令行应用入口脚本

在项目根目录micro-hau下,创建yii文件,在文件内添加如下内容:

#!/usr/bin/env php
<?php
/**
 * 命令行应用入口脚本. 第一行 #!/usr/bin/env php 声明为php脚本
 */

// 是否开启debug模式
defined('YII_DEBUG') or define('YII_DEBUG', true);
// 设置环境常量
defined('YII_ENV') or define('YII_ENV', 'dev');

// 加载composer第三方引导文件
require __DIR__ . '/vendor/autoload.php';
// 引入Yii框架
require __DIR__ . '/vendor/yiisoft/yii2/Yii.php';
// 公共应用里的引导配置 主要初始化 根别名
require __DIR__ . '/common/config/bootstrap.php';
// 当前命令行应用的引导配置
require __DIR__ . '/console/config/bootstrap.php';

$config = yii\helpers\ArrayHelper::merge(
    require __DIR__ . '/common/config/main.php',
    require __DIR__ . '/common/config/main-local.php',
    require __DIR__ . '/console/config/main.php',
    require __DIR__ . '/console/config/main-local.php'
);

$application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);

创建命令行应用控制器

在console/controllers目录下,创建IniController.php文件,在文件内添加如下内容:

<?php
/**
 * @link https://gitee.com/toshcn/micro-hau
 * @copyright Copyright (c) 2022/4/15 micro-hau
 * @author toshcn <toshcn@foxmail.com>
 */

namespace console\controllers;

use yii\console\Controller;
use yii\console\ExitCode;

/**
 * Class IniController
 * @package console\controllers
 */
class IniController extends Controller
{
    /**
     * Test action is IniController test function.
     * @return int
     */
    public function actionTest()
    {
        echo "Begin init !\n";
        sleep(1);
        echo "End init !\n";
        return ExitCode::OK;
    }
}

现在打开命令终端 运行php yii init/test

在项目根目录下,运行效果如下:

$ php yii init/test

Begin init !
End init !

控制台命令用法

你可以使用以下语法来执行控制台控制器动作:

yii <route> [--option1=value1 --option2=value2 ... argument1 argument2 ...]

<route> 指的是控制器动作的路由。option选项将填充控制器类属性, argument参数是动作方法的参数