Yii2.0 RESTful API 之版本控制

hedeqiang發表於2019-06-06

Yii2.0 RESTful API 之版本控制

之前我寫過兩篇關於 Yii2.0 RESTful API 如何搭建,以及 認證 等處理,但是沒有涉及到版本管理,今天就來談談版本管理如何實現。

索性就從頭開始一步一步搭建吧,但是關於一些概念以及使用本篇就不一一解釋了,可以參考 第一篇 Yii2.0 RESTful API 基礎配置教程 進行配置

安裝Yii2.0

通過 Composer 安裝

這是安裝Yii2.0的首選方法。如果你還沒有安裝 Composer,你可以按照這裡的說明進行安裝。

安裝完 Composer,執行下面的命令來安裝 Composer Asset 外掛:

composer global require "fxp/composer-asset-plugin:^1.2.0"
複製程式碼

安裝高階的應用程式模板,執行下面的命令:

composer create-project yiisoft/yii2-app-advanced yii-api 2.0.14
複製程式碼

拷貝backend目錄,命名為api

開啟api\config\main.php 修改id,controllerNamespace

return [
    'id' => 'app-api',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'api\controllers',
]
複製程式碼

初始化高階模板

在初始化之前不妨先看下這篇文章

cd advanced
php init
複製程式碼

開啟common\config\main.php開啟url路由美化規則

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
    ],
],
複製程式碼

開啟common\config\bootstrap.php新增以下別名

Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');
複製程式碼

ok,以上工作準備完畢,接下來進入正題, 關於版本更多介紹可以參考 權威指南 ,這裡不過多解釋(PS:主要我也不會......)

我的理解: Yii2 的版本你可以理解為不同的模組,每一個版本就是一個新的模組,比如常見的v1,v2等。

模組的搭建

關於如何生成模組,我們可以使用GII來進行生成.

配置 GII

開啟 api/config/main-local.php 檔案 修改如下:

if (!YII_ENV_TEST) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '*']
    ];
}
複製程式碼

我這裡因為使用的是 Homestead ,預設是不允許訪問 GII 的,所以得加上'allowedIPs' => ['127.0.0.1', '*'] ,否則會出現 Forbidden (#403), 你可以根據自己的需要來進行配置,或者不配置

生成Modules

瀏覽器中輸入 http://your host/gii ,可以看到 Module Generator ,點選 Start

Modules Class 中輸入:api\modules\v1\Module

Module ID 中輸入v1,(一般會自動輸入)

點選 Preview

Yii2.0 RESTful API 之版本控制

最後點選 Generate 進行生成

Yii2.0 RESTful API 之版本控制

配置模組

開啟 api/config/main.php 檔案,修改 modules

'modules' => [
    'v1'=>[
        'class'=>'api\modules\v1\Module',
    ],
],
複製程式碼

接著修改 urlManager

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yii\rest\UrlRule',
            'controller' => 'v1/default',
            'extraPatterns'=>[
                'GET index'=>'index',
            ],
        ],
    ],
],
複製程式碼

基於以上,Yii2.0 RESTFul API 就實現了版本管理,我們可以通過如下地址進行訪問:

http://localhost/v1/defaults
複製程式碼

多說一點,我上方的地址是已經對映到api/web目錄,請根據自己的實際情況進行配置

開啟剛生成的 modules 檔案目錄,可以看到裡面存在一個 v1 的目錄,可以看到該目錄還有一個controllers,以及一個 views 目錄 ,我們剛才訪問的 defaults 其實就是這兩個檔案,和傳統的web專案一樣控制器渲染檢視

好了,你可能知道了,我們以後的控制器程式碼就放到 modules/v1/controllers 裡了

剛才僅僅是預設GII為我們生成的程式碼,因為我們是API,所以 views 目錄,我們一般情況下用不到。

新建一個 rest 的控制器 在 modules\v1\controllers 下新建 UserController

<?php

namespace api\modules\v1\controllers;

use yii\rest\Controller;

/**
 * User controller for the `v1` module
 */
class UserController extends Controller
{
    /**
     * @return string
     */
    public function actionIndex()
    {
        return 'this is v1/user';
    }
}

複製程式碼

修改 api/config/main.php 中的urlManager

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yii\rest\UrlRule',
            'controller' => 'v1/default',
            'extraPatterns'=>[
                'GET index'=>'index',
            ],
        ],
        ['class' => 'yii\rest\UrlRule',
            'controller' => 'v1/user',
            'extraPatterns'=>[
                'GET index'=>'index',
            ],
        ],
    ],
],
複製程式碼

試著訪問下

http://localhost/v1/users/index
複製程式碼

ok,以上就是 Yii2.0 版本管理的實現方式

格式化響應

修改 api/config/main.phpcomponents 陣列中新增 response

'response' => [
    'class' => 'yii\web\Response',
    'on beforeSend' => function ($event) {
        $response = $event->sender;
        $response->data = [
            'success' => $response->isSuccessful,
            'code' => $response->getStatusCode(),
            'message' => $response->statusText,
            'data' => $response->data,
        ];
        $response->statusCode = 200;
    },
],
複製程式碼

至此關於 Yii2.0 RESTFul API 我一共完成了 3 篇文章,分別為:

Yii2.0 RESTful API 基礎配置教程

Yii2.0 RESTful API 認證教程

Yii2.0 RESTful API 之版本控制

寫得實在不怎麼樣,您如果看了有收穫,不妨留言給個評論,或者您覺得寫得有問題,或者不明白,也可以留言,我們可以一塊探討研究。

相關文章