1. 程式人生 > >yii2框架-restful的基礎入門(二十一)

yii2框架-restful的基礎入門(二十一)

今天給人的感覺就是“熱,很熱,熱中暑”!
最近的高溫天氣簡直讓人不能活啊,聽說華中地區的溫度居然超過40度,廣東的溫度也接近37度,戶外工作的真的做好避暑咯!
趁著今天工作之餘,感覺總的寫些什麼東西。現在回想起來,自己學習程式設計也接近3年了,從大三開始正式學習php,當時是跟著LAMP兄弟連的老師一邊看視訊,一邊查詢資料,一邊練習,做些小的模組,比如登入,分頁,簡單的CURD等等。到後來逐漸接觸thinkphp框架,學習mvc開發模式,瞭解php自動註冊機制,名稱空間,類庫,魔術方法等,自己是一直在慢慢進步,也遇到過很多的困難,也得到很多人的幫助。
現在工作一年多的時間裡,在實際的專案目中,用到和學到的知識就更多,mongodb,redis,nginx,叢集,ffmpeg,nodejs,angularjs,workerman,swoole,yii2框架,還有各種開源的類庫或者元件等!google,百度,github,各種技術論壇,例如推酷,指令碼之家,開源中國等等,這些都成為了這三年來陪伴我的夥伴。
今天想寫的應該是關於yii2的restful api部分。作為一名軟體研發的工程師,其實我們的專案應用中是經常做一些介面的,給第三方呼叫。
restful 是一種設計的規範,表述的是一種狀態轉移(可以自己百度瞭解),URI代表的是一種直觀的請求資源。
當然,設計restful api 只是為了更加規範設計介面而已,並不是說一定就要按照restful的規範去設計,利用我們平常的post或者get的方式也是可以的,只是看起來並沒有那麼的直觀明瞭,所以說設計的介面這個要根據自己的業務來做設計。
下面我們來了解一下設計介面一般要滿足什麼的條件?
(1)API的URL(或者URI)
(2)認證和授權API。必須要認證才能合法通過api訪問內容
(3)傳遞的資料。以get或者post的方式傳json型別資料或者其他型別
(4)返回的資料格式。以json資料格式返回,當然還要包括狀態碼,資訊,返回的資料這三者
(5)api版本化。其實還會有一個很重要的額外條件就是API的版本化,這個是非常重要的。
以上5個應該是最簡單的api介面條件了。
yii2的restful api 是一種規範設計的API,當然也是滿足以上的4個條件的。

這是權威指南:http://www.yiichina.com/doc/guide/2.0/rest-quick-start,可以認真看看。

首先我們在yii2的高階框架中將api介面作為一個應用,也就是和fronted,backend是同級的應用。那麼我們就可以在api這個應用中以模組化設計來實現版本化的設計。

簡單地說,就是一個v1模組,代表v1版本,介面升級時,定義v2的模組,代表v2版本,這樣子不論是v1,v2的介面都可以使用,比如一個app之前是接入v1版本介面的,現在更新的app,對應接入的v2版本介面,那麼這兩個app都依然可以使用,兩個版本的介面都在服務。
(1)首先我們將fronted資料夾複製,並且貼上在同一個目錄下,重新命名為api,那麼這個api就是一個介面應用了。
接下來將api裡的controllers和models這兩個資料夾的所有檔案都刪除?為什麼呢?因為這兩個資料夾裡面的類的名稱空間是fronted開頭的(因為我們是複製過來的檔案)

(2)修改配置檔案

在api的config的檔案下面,有一個boostrap.php的檔案和main.php的主配置檔案,因為這是我們新建的api應用,所以必須要設定api的別名。

在boostrap.php檔案中新增:
Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
當然我們也可以在common/config/boostrap.php中新增:
Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
因為這個common/config/boostrap.php就是設定應用別名的,裡面程式碼:
Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
所以可以在這裡新增設定api的別名,直接新增
Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
那麼還有一個main.php的主配置檔案需要配置controllerNamespace屬性

'controllerNamespace' => 'api\controllers',

'modules' => [
        'v1' => [
            'class' => 'api\modules\v1\Module'
        ]

],

其他的配置就按照web應用常規配置就可以了

(3)核心的控制器yii\rest\ActiveController

這個核心的控制器是設計restful的base類,我們建立的控制器必須繼承這個yii\rest\ActiveController

<?php
namespace api\modules\v1\controllers;//利用gii產生模組v1,也就是v1版本

use yii\rest\ActiveController;

class UserController extends ActiveController
{
    public $modelClass = 'api\modules\v1\models\User';//對應的資料模型處理控制器
}
通過指定 yii\rest\ActiveController::modelClass 作為 api\modules\v1\models\User, 控制器就能知道使用哪個模型去獲取和處理資料。
當然這個api\modules\v1\models\User是可以直接繼承\yii\db\ActiveRecord的
<?php
namespace api\modules\v1\models;

use Yii;
use api\models\Order;
use yii\db\ActiveRecord
class User extends ActiveRecord
{

}

(4)配置路由元件

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        [
        	'class' => 'yii\rest\UrlRule',
         	'controller' => ['v1/user']
        ],
    ],
]
隨著以上所做的最小的努力,你已經完成了建立用於訪問使用者資料 的 RESTful 風格的 API。你所建立的 API 包括:

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

大家可以在yiisoft/yii2/rest資料夾下面看到很rest元件的各個檔案。

yii\rest\ActiveController的actions

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',
            ],
        ];
    }
分別對應不同的獨立的操作,這些獨立的操作也對應這不同的訪問urlrules。在yii/rest/UrlRule中
public $patterns = [
    'PUT,PATCH {id}' => 'update',
    'DELETE {id}' => 'delete',
    'GET,HEAD {id}' => 'view',
    'POST' => 'create',
    'GET,HEAD' => 'index',
    '{id}' => 'options',
    '' => 'options',
];
簡單地說,當我們
a)以get方法訪問http://localhost/lianxi/XML/advanced/api/web/v1/users,其實對應的獨立操作就是yii/rest/IndexAction
b)以post方法訪問http://localhost/lianxi/XML/advanced/api/web/v1/users,其實對應的獨立操作就是yii/rest/CreateAction。
c)以get方法訪問http://localhost/lianxi/XML/advanced/api/web/v1/users/1,就是獲取id=1的使用者,對應的獨立操作yii/rest/ViewAction。
d)以put,patch方式訪問http://localhost/lianxi/XML/advanced/api/web/v1/users/1,就是更改id=1的使用者的資訊,對應的獨立操作yii/rest/UpdateAction。
這四個是常見的CURD操作。
那麼我們可以如何測試這些介面呢?
利用google的開發工具postman可以很直觀輕鬆的進行介面的測試。
get方式獲取所有使用者


post方式建立新使用者


get方式獲取id=1的使用者


put方式更新id=1的使用者名稱為‘成龍’


delete方式刪除id=29的使用者