Yii2.0 搭建 RESTful API

随着前后端的分离,API模式大行其道。今天我们就来看看Yii2 的怎么用rest api。

首先我们在yii2-advance上扩展一个api 应用,首先操作步骤和前面的扩展应用教程一样,只不过应用名称叫api

因为api和是和客户端交互的譬如app ,小程序...,所以开发的时候呢我们就可以用Postman来模拟客户端

因为客户端升级会存在版本,所以API也会存在版本,通常我们会用yii2的module来做版本.

首先呢,我们用yii2 自带的 activeController 来做一个简单的 curd

为了演示:第一步我们建一个表 student

CREATE TABLE `student` ( 
 `id` int(11) NOT NULL AUTO_INCREMENT,  
 `name` varchar(100) NOT NULL DEFAULT '',  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `student` VALUES ('1', '张三');
INSERT INTO `student` VALUES ('2', '李四');
INSERT INTO `student` VALUES ('3', '王五');
INSERT INTO `student` VALUES ('4', '赵一');
INSERT INTO `student` VALUES ('5', '凑数');

2.然后利用gii在api的models目录建立student的model
3.利用gii的modules建立一个V1的Module

4.然后在v1的module里面建立Students的controller

5.现在api的目录大致如下

│
├─models
│      Student.php
│
├─modules
│  └─v1
│      │  Module.php
│      │
│      ├─controllers
│      │      DefaultController.php
│      │      StudentController.php
│      │
│      └─views
│          └─default│                  index.php

需要说明的是:在生成modules的步骤中,为了使我们的模块可以访问,不要忘记在main.php配置文件中添加下面的代码

<?php    
    ......    
    'modules' => [        
    'v1' => [            
        'class' => 'api\modules\v1\Module',
        ],
    ],
    ......

6.重新配置控制器Student

<?php
namespace api\modules\v1\controllers;
use yii\rest\ActiveController;
class StudentController extends ActiveController
{    public $modelClass = 'api\models\Student';
}

7.为Students配置Url规则

在api的config的main.php 里找到UrlManage选项找到rules

'rules' => [
    [        
    'class' => 'yii\rest\UrlRule',       
    'controller' => ['v1/student']
    ],
]

8.这样就好了,可以通过postman 访问

这里为什么用/v1/studens 访问而不是用/v1/student , 默认在restful 访问使用资源的复数形式,然是如果你想用单数的化

第7步的设置要改为这样:

在api的config的main.php 里找到UrlManage选项找到rules

'rules' => [
    [        
    'class' => 'yii\rest\UrlRule',       
    'controller' => ['v1/student'],
    'pluralize' => false,    //设置为false 就可以去掉复数形式了
    ],
]

这里activeController 同样封装了以下api

GET /v1/students: 逐页列出所有学生
HEAD /v1/students: 显示学生列表的概要信息
POST /v1/students: 创建一个新学生
GET /v1/students/1: 返回学生 1 的详细信息
HEAD /v1/students/1: 显示学生 1 的概述信息
PATCH /v1/students/1 and PUT /v1/students/1: 更新学生1
DELETE /v1/students/1: 删除学生1
OPTIONS /v1/students: 显示关于末端 /v1/students 支持的动词
OPTIONS /v1/students/1: 显示有关末端 /v1/students/1 支持的动词

当然如果你不想要这些api 那么在StudentController.php中

 public function actions()
    {
        $action= parent::actions(); // TODO: Change the autogenerated stub
        unset($action['index']);
        unset($action['create']);
        unset($action['update']);
        unset($action['delete']);
    }    
    public function actionIndex()
    {        //你的代码
    }

可以注销掉这些方法,写自己的方法。


当然在现实业务中我们写api也不一定会遵循restful风格,也许一个POST动作就够了,但是响应数据格式要求一致,post的body数据也许是raw的Json格式(今天教程里面的是x-www-form格式),还有api的速率需要限制,api的授权认证... 等更多需求。

评论区
登陆 后评论!