随着前后端的分离,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的授权认证... 等更多需求。