Yii2.0 RESTful API 基础配置教程详解


Posted in PHP onDecember 26, 2018

最近在做Yii2.0 RESTful API功能,找了好久的资料,才找到这类的教程,感谢该作者,以下内容根据我的项目实际情况做了一定的修改。

安装yii2.0

安装 Composer 后,您可以通过在 Web 可访问的文件夹下运行以下命令来 安装Yii应用程序模板:

composer create-project --prefer-dist yiisoft/yii2-app-basic basic

初始化高级模板

cd advanced
./init

输入"./init"后会出现以下内容

Yii Application Initialization Tool v1.0

Which environment do you want the application to be initialized in?

  [0] Development
  [1] Production

  Your choice [0-1, or "q" to quit] 0

  Initialize the application under 'Development' environment? [yes|no] yes

  Start initialization ...

修改数据库连接属性

打开 commonconfigmain-local.php,配置数据库连接信息

'db' => [
      'class' => 'yii\db\Connection',
      'dsn' => 'mysql:host=127.0.0.1;dbname=yii',
      'username' => 'root',
      'password' => 'root',
      'charset' => 'utf8',
    ],

执行 migrate 数据库迁移

./yii migrate

拷贝backend目录,命名为api

打开apiconfigmain.php 修改id,controllerNamespace等,将所有backend替换为api:

return [
  'id' => 'app-api',
  'basePath' => dirname(__DIR__),
  'controllerNamespace' => 'api\controllers',
]

打开apiconfigmain.php开启url路由美化规则

'urlManager' => [
      'enablePrettyUrl' => true,
      'showScriptName' => false,
      'rules' => [
      ],
    ],

打开commonconfigbootstrap.php添加以下别名

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

为什么要单独创建API应用

单独创建API应用,目的是便于维护,可以避免以下问题

  • 配置的冲突
  • 控制器的命名不便
  • url美化规则冲突
  • 分工明确frontend为前台目录;backend为后台目录;api为api目录

接下来打开 apicontrollers 新建一个User控制器,继承 yiirestActiveController,命名为 UserController,代码如下:

<?php
namespace api\controllers;
use yii\rest\ActiveController;

class UserController extends ActiveController
{
  public $modelClass = 'common\models\User';
  
}

配置URL规则

为刚才的 user控制器添加url美化规则

打开 apiconfigmain.php 修改 components属性,添加下列代码:

...
'urlManager' => [
  'enablePrettyUrl' => true,
  'enableStrictParsing' => true,
  'showScriptName' => false,
  'rules' => [
    ['class' => 'yii\rest\UrlRule', 
    'controller' => 'user'
    ],
  ],
]

...

ok,到此就成了一个 符合 RESTful 风格的API

看起来在控制器了什么也没有写,只是指定了一个模型,但是她的背后完成了很多的功能哦,列表如下:

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

如何访问呢

你可以使用 curl命令进行访问,命令如下:

curl -i -H "Accept:application/json" http://localhost/users

命令行下还是比较麻烦的,也不方便测试,推荐使用 API测试工具

这类的工具有很多,我就不一一列举了,这里推荐 Postman,很好很强大,Chorme也有插件,可以安装,这里我推荐直接下载软件安装调试,比较方便

你可能发现了 访问任何路由地址都是加的s,users , 为什么呢? 资源,你要理解 资源二字,既然是资源肯定是个集合,肯定有一大堆,所以要加上复数,我是这么理解的。

你说我就是不想加上s,我就想采用http://localhost/user 这种方式来进行访问,好吧,可以,满足你,只是不推荐

继续打开配置文件apiconfigmain.php修改刚才添加的 urlManager 如下:

'urlManager' => [
  'enablePrettyUrl' => true,
  'enableStrictParsing' => true,
  'showScriptName' => false,
  'rules' => [
    ['class' => 'yii\rest\UrlRule', 
    'controller' => 'user',
    'pluralize' => false,  //设置为false 就可以去掉复数形式了
    ],
  ],
]

加入 'pluralize' => false, 就表示去掉复数形式了,再次强调不推荐

ok,在控制器中我们没有写任何一句代码,他就给我们生成许多方法,但是有时候我们可能需要修改一些代码,来达到我们想要的效果,比如连表查询,然后再返回数据

接下来我们就实现这样的功能:

打开刚才新建的user控制器, 重写 action方法:

<?php

namespace api\controllers;
use yii\rest\ActiveController;

class UserController extend extends ActiveController
{
  public $modelClass = 'common\models\User';
  
  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()
  {
    //你的代码
  }
  
}

这样我们就可以重写他的代码了。哈哈

我们再新建一个自己的 action

<?php

namespace api\controllers;
use yii\rest\ActiveController;

class UserController extends ActiveController
{
  public $modelClass = 'common\models\User';
  
  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()
  {
    //你的代码
  }
  
  public function actionTest() //假如是get请求
  {
    //业务逻辑
  }
  
}

然后试着访问一下 http://localhost/users/test,报错?找不到?

报错就对了,那是因为我们没有设置其他路由访问

修改 apiconfigmain.php

'urlManager' => [
  'enablePrettyUrl' => true,
  'enableStrictParsing' => true,
  'showScriptName' => false,
  'rules' => [
    ['class' => 'yii\rest\UrlRule', 
    'controller' => 'user',
    //'pluralize' => false,  //设置为false 就可以去掉复数形式了
    'extraPatterns'=>[
      'GET send-email'=>'test'
    ],
    ],
  ],
]

接下来重新访问就没有问题了,ps:你自己编写的任何 action 都要在 extraPatterns 进行配置

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 动态随机生成验证码类代码
Apr 09 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
Aug 14 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
Sep 27 PHP
php实现encode64编码类实例
Mar 24 PHP
java微信开发之上传下载多媒体文件
Jun 24 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
laravel-admin 实现给grid的列添加行数序号的方法
Oct 08 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 PHP
CI框架实现创建自定义类库的方法
Dec 25 #PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 #PHP
PHP使用SOAP调用API操作示例
Dec 25 #PHP
详解PHP实现支付宝小程序用户授权的工具类
Dec 25 #PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 #PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 #PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 #PHP
You might like
smarty的保留变量问题
2008/10/23 PHP
PHP 日期加减的类,很不错
2009/10/10 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
php中错误处理操作实例分析
2019/08/23 PHP
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
移动端界面的适配
2017/01/11 Javascript
简述JS控制台的使用
2018/07/15 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python操作CouchDB数据库简单示例
2015/03/10 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
Python wordcloud库安装方法总结
2020/12/31 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
世界第一冲浪品牌:O’Neill
2016/08/30 全球购物
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
装潢设计专业推荐信模板
2013/11/26 职场文书
倡议书范文
2014/04/16 职场文书
师德先进个人材料
2014/12/20 职场文书
护士岗位竞聘书
2015/09/15 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL