1. 程式人生 > >Yii2 使用 RESTful 寫API介面 例項

Yii2 使用 RESTful 寫API介面 例項

Yii2 使用 RESTful?

注意: 我們使用resTful的同時,需要藉助於測試工具進行地址訪問,例如: 谷歌的PostMAN,火狐的HttpRequester工具來訪問

建立一個控制器 

我的工作目錄如圖所示 (首先, 參照下面的目錄圖片,可以看出,我建立了兩個大的資料夾,v1,v2,目的是測試訪問不同版本的介面)


下面以v2中的檔案為例:

建立一個控制器類api\modules\v2\UserController 如下,

namespace api\modules\v2\controllers;

use yii\rest\ActiveController;

class UserController extends ActiveController
{
    public $modelClass = 'api\modules\v2\models\user\UserBaseInfo';
}

控制器類擴充套件自 yii\rest\ActiveController。通過指定 yii\rest\ActiveController::modelClass作為api\modules\v2\models\user\UserBaseInfo, 控制器就能知道使用哪個模型去獲取和處理資料。

配置URL規則

修改有關在應用程式配置的urlManager元件的配置:

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yii\rest\UrlRule', 'controller' => 'user'],  
    ],
]

說明: 

      a): 上面的配置主要是為user控制器增加一個 URL 規則。這樣,使用者的資料就能通過美化的 URL 和有意義的 http 動詞進行訪問和操作。

      b): 上面是沒有加上版本的url配置,至於關於版本我將以新的一篇來說明.

配置另外的:

'controllerNamespace' => 'api\controllers',
'components' => [
        'user' => [
            'identityClass' => 'api\modules\v1\models\oauth\AccessToken',
            'enableAutoLogin' => true,
            'enableSession' => false,
            'loginUrl' => null
        ],

嘗試

隨著以上所做的最小的努力,你已經完成了建立用於訪問使用者資料的 RESTful 風格的 API。你所建立的 API 包括:

相比於URL管理的Web應用程式,上述主要的新東西是通過RESTful API請求yii\rest\UrlRule。這個特殊的URL規則類將會建立一整套子URL規則來支援路由和URL建立的指定的控制器。例如, 上面的程式碼中是大致按照下面的規則:

[
    'PUT,PATCH users/<id>' => 'user/update',
    'DELETE users/<id>' => 'user/delete',
    'GET,HEAD users/<id>' => 'user/view',
    'POST users' => 'user/create',
    'GET,HEAD users' => 'user/index',
    'users/<id>' => 'user/options',
    'users' => 'user/options',
]

  • GET /users: 逐頁列出所有使用者
  • HEAD /users: 顯示使用者列表的概要資訊
  • POST /users: 建立一個新使用者
  • GET /users/123: 返回使用者 123 的詳細資訊
  • HEAD /users/123: 顯示使用者 123 的概述資訊
  • PATCH /users/123 and PUT /users/123: 更新使用者123
  • DELETE /users/123: 刪除使用者123
  • OPTIONS /users: 顯示關於末端 /users 支援的動詞
  • OPTIONS /users/123: 顯示有關末端 /users/123 支援的動詞

補充:Yii 將在末端使用的控制器的名稱自動變為複數。(譯註:個人感覺這裡應該變為注意)

經過上面的配置後,你會看到你的控制類繼承的是yii\rest\ActiveController,如果你進這個檔案後,你會看到下面這些方法:

public function actions()
{
        return [
            'index' => [
                'class' => 'yii\rest\IndexAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'view' => [
                'class' => 'yii\rest\ViewAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'create' => [
                'class' => 'yii\rest\CreateAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
                'scenario' => $this->createScenario,
            ],
            'update' => [
                'class' => 'yii\rest\UpdateAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
                'scenario' => $this->updateScenario,
            ],
            'delete' => [
                'class' => 'yii\rest\DeleteAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'options' => [
                'class' => 'yii\rest\OptionsAction',
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    protected function verbs()
    {
        return [
            'index' => ['GET', 'HEAD'],     
            'view' => ['GET', 'HEAD'],      
            'create' => ['POST'],
            'update' => ['PUT', 'PATCH'],
            'delete' => ['DELETE'],
        ];
    }

從上面的方法我們可以知道,如果在你使用yii框架自帶的方法時,它預設有create, delete, update, index, view等的一下方法

所建立的 API 包括:

  • GET /users: 逐頁列出所有使用者
  • POST /users: 建立一個新使用者
  • GET /users/123: 返回使用者 123 的詳細資訊
  • PATCH /users/123 and PUT /users/123: 更新使用者123
  • DELETE /users/123: 刪除使用者123
但是如果你要是不想用他的某些方法,我們可以通過下面的方法來自己覆蓋對應的方法

例如:

public function actions()
{
    $actions = parent::actions();

    // 登出系統自帶的實現方法
    unset($actions['index']);
    
    //unset($actions['create']);
    //unset($actions['update']);
    //unset($actions['delete']);

  return $actions;
}

//覆蓋父類的actionIndex方法,並進行重寫
public function actionIndex()
{
    //獲取使用者所有資訊
    ......
}

對於其他的方法同上....

於是我們就可以通過方法地址獲取想要的資料:GET  http://www.api.com/users