從零開始搭建完整的電影全棧系統(tǒng)(三)——restfulApi的編寫

創(chuàng)建API應(yīng)用入口:

1,復(fù)制 backend ? api, environments/dev/backend ? environments/dev/
api 以及 environments/prod/backend ? environments/prod/api.
2,修改配置?件main.php,需要修改應(yīng)?id、命名空間、?戶組件和url美化
的配置內(nèi)容

'id' => 'app-api',
'controllerNamespace' => 'api\controllers',

3,在 common\config\bootstrap.php 中添加api的路徑別名

Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');

單獨(dú)創(chuàng)建api入口的好處:
單獨(dú)創(chuàng)建API應(yīng)?,?的是便于維護(hù)??梢员苊膺@些問題:
? 配置的沖突
? 控制器的命名不便
? url美化規(guī)則沖突

創(chuàng)建第?個API應(yīng)?:

1,創(chuàng)建了vod-detail控制器:
VodDetailController.php

<?php

namespace api\controllers;

use Yii;
use common\models\VodDetail;
use common\models\VodDetailSearch;
use yii\rest\ActiveController;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

/**
 * VodDetailController implements the CRUD actions for VodDetail model.
 */
class VodDetailController extends ActiveController
{
    public $modelClass = 'common\models\VodDetail';
}

2,在配置?件中,創(chuàng)建了針對vod-detail控制
器的url美化規(guī)則:
main.php:

'urlManager' => [
            'enablePrettyUrl' => true,
            //嚴(yán)格解析 至少要符合rules中的一條,否則拋出異常
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => 'vod-detail',
                ],
            ],
        ],

3,配置main-local?件,讓API應(yīng)?能接收
JSON 格式的輸?數(shù)據(jù):
main-local.php:

'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]

使用postman調(diào)試:

在這里插入圖片描述

在這里插入圖片描述

可以看出經(jīng)過簡單的代碼編寫和配置,完全可以訪問輸出符合restful風(fēng)格的Api接口了。
但,還是有些問題要解決。比如:vod_create_time和vod_update_time字段是時間戳,我們需要轉(zhuǎn)換,另外,并沒有輸出播放地址列表.

時間戳我們不轉(zhuǎn)換,調(diào)用時可以在客戶端轉(zhuǎn)換,接下來我們實(shí)現(xiàn)自定義播放地址字段。

字段的?定義設(shè)置 :

可以重寫模型類的 fields() 或extraFields()
?法,根據(jù)需求設(shè)置字段以及字段的值,這樣,Serializer轉(zhuǎn)換出 來的數(shù)組就是我們需要的數(shù)據(jù)了。

1,在客戶端發(fā)送的api請求地址上,通過fields參數(shù)來指定需要的字段 ,
2,我們重寫fields?法來指定需要的字段,還可以?定義字段名。
,3,在fields?法中,通過匿名函數(shù)?定義字段的值。 ,
4,通過重寫extrafields這個?法來?定義字段 ,
5,可以?unset來屏蔽字段
我們通過重寫extrafields這個?法來?定義字段 ,實(shí)現(xiàn)播放地址。

1,在VodDetail模型類中增加getPlayurls方法,重寫extrafields方法:

/***
     * @return \yii\db\ActiveQuery
     * 獲取視頻對應(yīng)的播放地址
     */
    public function getPlayurls()
    {
        return $this->hasMany(PlayUrl::className(), ['url_id' => 'url_id']);
//        $playurls = $this->hasMany(PlayUrl::className(), ['url_id' => 'url_id']);
//        return ArrayHelper::index($playurls, null, 'play_from');
    }



    /**
     * 重寫extraFields 添加關(guān)聯(lián)字段
     * @return array|false
     */

    public function extraFields()
    {
        return ['playurls'];
    }

2,配置Url美化規(guī)則默認(rèn)顯示自定義的extraFields字段'playurls':

'ruleConfig' => [
                        'class' => 'yii\web\UrlRule',
                        'defaults' => [
                            'expand' => 'playurls',
                        ],
                    ],

再次通過postman模擬請求api可以看到播放地址已經(jīng)顯示了:


顯示播放地址

在控制器中實(shí)現(xiàn)類似WEB網(wǎng)站中列表頁的按任何字段搜索和排序功能:

VodDetailController.php
先釋放掉默認(rèn)的index方法:

public function actions()
    {
        $actions = parent::actions();
        unset($actions['index']);
        return $actions;
    }

再重寫index方法:

public function actionIndex()
    {
        $params = Yii::$app->getRequest()->queryParams;
        $searchModel = new VodDetailSearch();
        return $searchModel->search($params);
    }

這里就實(shí)現(xiàn)了理論上可以按照vod_detail表中的任何字段搜索過濾和排序。

比如按分類過濾:


按分類過濾

按標(biāo)題搜索:


按標(biāo)題搜索

按id順序、倒序排序:


id順序排列

id倒序排列

甚至支持多個字段聯(lián)合搜索過濾。。。。

最后,由于api控制器默認(rèn)實(shí)現(xiàn)了增刪改查及index方法,我們只需要index方法和查,為了安全我們在url美化中禁用增、刪、改。

'except' => ['delete', 'create', 'update'],//設(shè)置被禁用的http動詞

很少的代碼量并搭配簡單的配置,就實(shí)現(xiàn)了和web網(wǎng)站一樣功能的 符合restful風(fēng)格的Api。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容