环境配置:
开启服务器伪静态
本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码
loadmodule rewrite_module modules/mod_rewrite.so
将其前面的#去掉,如果没有找到则添加进去。
找到一下代码
allowoverride all options none require all granted
将原本的allowoverride none改为allowoverride all。
然后在站点根目录下创建一个.htaccess文件,内容如下:
options +followsymlinks rewriteengine on rewritecond %{request_filename} !-d rewritecond %{request_filename} !-f rewriterule . index.php
.htaccess此处不再赘述yii2的配置,如果需要可以看yii2实战手册。
yii2实际操作:
1、配置url规则及modules
(1)新建modules文件夹,实行api接口版本控制。例如v1版本、v2版本……
在v1文件夹下新建controllers文件夹(控制器)、models文件夹(模型)、module.php配置文件。
module.php文件如下:
1 php 2namespace api\modules\v1; 3 4class module extends \yii\base\module 5{ 6 7public$controllernamespace = 'api\modules\v1\controllers'; 8 9publicfunction init()10 {11 parent::init();12 }13 }
第2行和第7行随版本扩展而变化(v1->v2...)。
(2)配置config文件夹下的main.php文件
1 php 2$params = array_merge(require (__dir__ . '/../../common/config/params.php'), require (__dir__ . '/../../common/config/params-local.php'), require (__dir__ . '/params.php'), require (__dir__ . '/params-local.php')); 3 4return [ 5 'id' => 'app-api', 6 'basepath' => dirname(__dir__), 7 'bootstrap' => [ 8 'log' 9 ],10 'modules' => [11 'v1' => [12 'class' => 'api\modules\v1\module'13 ],14 'v2' => [15 'class' => 'api\modules\v2\module'16 ]17 ],18 'controllernamespace' => 'api\controllers',19 'components' => [20 'user' => [21 'identityclass' => 'common\models\user',22 'enableautologin' => false,23 'enablesession' => false,24 'loginurl' => null25 ],26 'urlmanager' => [27 'enableprettyurl' => true, // 启用美化url28 'enablestrictparsing' => true, // 是否执行严格的url解析29 'showscriptname' => false, // 在url路径中是否显示脚本入口文件30 'rules' => [31 [32 'class' => 'yii\rest\urlrule',33 'controller' => [34 'v1/site'35 ]36 ],37 [38 'class' => 'yii\rest\urlrule',39 'controller' => [40 'v2/site'41 ]42 ]43 ]44 ],45 'log' => [46 'tracelevel' => yii_debug ? 3 : 0,47 'targets' => [48 [49 'class' => 'yii\log\filetarget',50 'levels' => [51 'error',52 'warning'53 ]54 ]55 ]56 ],57 'errorhandler' => [58 'erroraction' => 'site/error'59 ]60 ],61 'params' => $params62 ];
main.php注意10~17行、20~44行的组件配置,相信大家仔细阅读就能明白,此处不再赘述原理,请大家尤其注意33~35行的代码,此处表示的是v1/site控制器,随着接口控制器的增多,可以直接在数组中增加即可。本文力求快速配置出restful架构的实现。
(3)v2、v3表示以后的版本变化,配置都类似于v1文件夹。
2、创建一个模型
数据库准备一个名为mxq_guide的数据表
create table `mxq_guide` ( `id` int(11) not null auto_increment, `imgurl` varchar(255) defaultnull comment '图片路径',
`status` int(11) defaultnull comment '1启用 0禁用',
`flag` int(11) defaultnull comment '1安卓 2苹果',
primary key (`id`)
) engine=myisam auto_increment=24 default charset=utf8 comment='app导航图';
创建后请注意及时往数据库添加几条数据信息。
通过脚手架gii来创建guide.php模型(使用方法请看yii2权威指南)。生成后的文件注意改写,修改为如下形式以满足restful的需求。之后从models文件夹中转移到v1/models文件夹中,并注意命名空间的修改。
1 php 2namespace api\modules\v1\models; 3 4use yii; 5use yii\db\activerecord; 6use yii\web\identityinterface; 7 8/** 9 * this is the model class for table {{%guide}}.10 *11 * @property integer $id12 * @property string $imgurl13 * @property integer $status14 * @property integer $flag15*/16class guide extends activerecord implements identityinterface17{1819publicstaticfunction findidentitybyaccesstoken($token, $type = null)20 {21returnstatic::findone([22 'access_token' => $token23 ]);24 }2526publicfunction getid()27 {28return$this->id;29 }3031publicfunction getauthkey()32 {33return$this->authkey;34 }3536publicfunction validateauthkey($authkey)37 {38return$this->authkey === $authkey;39 }4041publicstaticfunction findidentity($id)42 {43returnstatic::findone($id);44 }4546publicstaticfunction tablename()47 {48return '{{%guide}}';49 }5051publicfunction rules()52 {53return [54 [55 [56 'imgurl',57 'status',58 'flag'59 ],60 'required'61 ],62 [63 [64 'status',65 'flag'66 ],67 'integer'68 ],69 [70 [71 'imgurl'72 ],73 'string',74 'max' => 25575 ]76 ];77 }7879publicfunction attributelabels()80 {81return [82 'id' => yii::t('app', 'id'),83 'imgurl' => yii::t('app', 'imgurl'),84 'status' => yii::t('app', 'status'),85 'flag' => yii::t('app', 'flag')86 ];87 }88 }
guide.php3、创建一个控制器
1 php 2namespace api\modules\v1\controllers; 3 4use yii; 5use yii\rest\activecontroller; 6use yii\filters\auth\compositeauth; 7use yii\filters\auth\queryparamauth; 8use yii\data\activedataprovider; 910class sitecontroller extends activecontroller11{1213public$modelclass = 'api\modules\v1\models\guide';1415public$serializer = [16 'class' => 'yii\rest\serializer',17 'collectionenvelope' => 'items'18 ];1920// public function behaviors()21 // {22 // $behaviors = parent::behaviors();23 // $behaviors['authenticator'] = [24 // 'class' => compositeauth::classname(),25 // 'authmethods' => [26 // queryparamauth::classname()27 // ]28 // ];29 // return $behaviors;30 // }31publicfunction actions()32 {33$actions = parent::actions();34// 注销系统自带的实现方法35unset($actions['index'], $actions['update'], $actions['create'], $actions['delete'], $actions['view']);36return$actions;37 }3839publicfunction actionindex()40 {41$modelclass = $this->modelclass;42$query = $modelclass::find();43returnnew activedataprovider([44 'query' => $query45 ]);46 }4748publicfunction actioncreate()49 {50$model = new$this->modelclass();51// $model->load(yii::$app->getrequest()52 // ->getbodyparams(), '');53$model->attributes = yii::$app->request->post();54if (! $model->save()) {55returnarray_values($model->getfirsterrors())[0];56 }57return$model;58 }5960publicfunction actionupdate($id)61 {62$model = $this->findmodel($id);63$model->attributes = yii::$app->request->post();64if (! $model->save()) {65returnarray_values($model->getfirsterrors())[0];66 }67return$model;68 }6970publicfunction actiondelete($id)71 {72return$this->findmodel($id)->delete();73 }7475publicfunction actionview($id)76 {77return$this->findmodel($id);78 }7980protectedfunction findmodel($id)81 {82$modelclass = $this->modelclass;83if (($model = $modelclass::findone($id)) !== null) {84return$model;85 } else {86thrownew notfoundhttpexception('the requested page does not exist.');87 }88 }8990publicfunction checkaccess($action, $model = null, $params = [])91 {92// 检查用户能否访问 $action 和 $model93 // 访问被拒绝应抛出forbiddenhttpexception94 // var_dump($params);exit;95 }96 }
sitecontroller.php控制器请创建在modules/controllers文件夹下,并注意命名空间的修改。
要注意的是,此处的控制器与普通的控制器继承controller不同,此处需继承activecontroller类。
20~30行注释的代码是基于restful架构的access_token认证,目前还未测试通过,后续补充。
至此,基于yii2的所有配置已基本完成,接下来介绍api接口测试工具及方法。
restful的测试工具postman:
首先介绍一下postman这款插件,是基于谷歌浏览器的一款模拟请求的实用插件。具体使用,在下面测试过程中涉及截图,介绍不足之处请见谅,自己也是第一次使用。
推荐使用上面的app版本,便于后续封装自己写好的api接口,下面的是网页版本。
yii2支持的restful有四种请求方式:get查看信息,post创建信息,put更新信息,delete删除信息。
下面开始演示四种请求数据的方式。(只是截图演示效果,具体使用还需要大家自己去摸索。)
此处演示的是get方法请求数据库的数据。对应的是modules/controllers/sitecontroller/actionindex方法。
请大家注意最上面方框内的url地址,rest默认将控制器进行复数请求http://api.mxq.com/v1/sites,此处就是rest的默认规则。
打*星号位置显示的是正常的效果,如若出现错误,大家可以去yii权威指南——错误检查错误原因。
yii2的activecontroller默认实现了数据的分页效果。
此处演示的是post方法新建数据库的数据。对应的是modules/controllers/sitecontroller/actioncreate方法。
如果在数据库的数据层写好数据校验规则,此处提交数据不满足要求的时候就会显示相应的错误。这也是rest的优势之一。比如如下情况,flag我定义的是int型:
接下来演示的是put方法更新数据库的数据。对应的是modules/controllers/sitecontroller/actionupdate方法。
此处请大家再次注意最上面的url:http://api.mxq.com/v1/sites/15 此处15代表的是数据库id为15的数据,表示更新数据库id为15的数据信息。请大家一定注意。restful在使用更新和删除数据操作的时候,id不能一表单的形式提交,必须紧跟在url之后。
接下来演示的是delete方法删除数据库的数据。对应的是modules/controllers/sitecontroller/actiondelete方法。
当返回值为1的时候表示的就是删除操作执行成功。具体原理请大家仔细观察sitecontroller控制器内的函数。
以上就是基于yii2的restful的一些简单介绍、实现方法以及测试结果。有什么不正确或遗漏的地方,欢迎大家来补充。后续也会在此基础上进行更新。本人第一次接触yii2框架和restful架构,表述如有不对之处,请大家见谅。
以上就介绍了yii2 advanced版api接口开发 基于restful架构的 配置、实现、测试,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。