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
andPUT /users/123
: 更新使用者123DELETE /users/123
: 刪除使用者123OPTIONS /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
andPUT /users/123
: 更新使用者123DELETE /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