乐趣区

关于restful:从零开始搭建完整的电影全栈系统三restfulApi的编写

创立 API 利用入口:

1,复制 backend ⾄ api, environments/dev/backend ⾄ environments/dev/
api 以及 environments/prod/backend ⾄ environments/prod/api.
2,批改配置⽂件 main.php,须要批改应⽤ id、命名空间、⽤户组件和 url 丑化
的配置内容

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

3,在 commonconfigbootstrap.php 中增加 api 的门路别名

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

独自创立 api 入口的益处:
独自创立 API 应⽤,⽬的是便于保护。能够防止这些问题:
• 配置的抵触
• 控制器的命名不便
• url 丑化规定抵触

创立第⼀个 API 应⽤:

1, 创立了 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, 在配置⽂件中,创立了针对 vod-detail 管制
器的 url 丑化规定:
main.php:

'urlManager' => [
            'enablePrettyUrl' => true,
            // 严格解析 至多要合乎 rules 中的一条,否则抛出异样
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => 'vod-detail',
                ],
            ],
        ],

3, 配置 main-local ⽂件,让 API 应⽤能接管
JSON 格局的输⼊数据:
main-local.php:

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

应用 postman 调试:


能够看出通过简略的代码编写和配置,齐全能够拜访输入合乎 restful 格调的 Api 接口了。
但,还是有些问题要解决。比方:vod_create_time 和 vod_update_time 字段是工夫戳,咱们须要转换,另外,并没有输入播放地址列表.

工夫戳咱们不转换,调用时能够在客户端转换,接下来咱们实现自定义播放地址字段。

字段的⾃定义设置:

能够重写模型类的 fields() 或 extraFields()
⽅法,依据需要设置字段以及字段的值,这样,Serializer 转换出 来的数组就是咱们须要的数据了。

1,在客户端发送的 api 申请地址上,通过 fields 参数来指定须要的字段 ,
2,咱们重写 fields ⽅法来指定须要的字段,还能够⾃定义字段名。
,3,在 fields ⽅法中,通过匿名函数⾃定义字段的值。,
4,通过重写 extrafields 这个⽅法来⾃定义字段 ,
5,能够⽤ unset 来屏蔽字段
咱们通过重写 extrafields 这个⽅法来⾃定义字段 , 实现播放地址。

1,在 VodDetail 模型类中减少 getPlayurls 办法,重写 extrafields 办法:

/***
     * @return \yii\db\ActiveQuery
     * 获取视频对应的播放地址
     */
    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 增加关联字段
     * @return array|false
     */

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

2,配置 Url 丑化规定默认显示自定义的 extraFields 字段 ’playurls’:

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

再次通过 postman 模仿申请 api 能够看到播放地址曾经显示了:

在控制器中实现相似 WEB 网站中列表页的按任何字段搜寻和排序功能:

VodDetailController.php
先开释掉默认的 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);
    }

这里就实现了实践上能够依照 vod_detail 表中的任何字段搜寻过滤和排序。

比方按分类过滤:

按题目搜寻:

按 id 程序、倒序排序:

甚至反对多个字段联结搜寻过滤。。。。

最初,因为 api 控制器默认实现了增删改查及 index 办法,咱们只须要 index 办法和查,为了平安咱们在 url 丑化中禁用增、删、改。

'except' => ['delete', 'create', 'update'],// 设置被禁用的 http 动词

很少的代码量并搭配简略的配置,就实现了和 web 网站一样性能的 合乎 restful 格调的 Api。

欢送各位大佬入裙交换(879782113):

退出移动版