【PHP】ThinkPHP5.0 Restful API 开发
一、要学习什么是 RESTful API 首先我们得明白什么是REST?
简单来说:REST是所有Web应用都应该遵守的架构设计指导原则。 英文全词Representational State Transfer,翻译是”表现层状态转化”。
面向资源 是REST最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。(7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS)。
简单来说就是将服务器的数据看做是资源,而RESTFUL API 就是给外部使用改变资源的一种操作方法,其中符合REST架构设置是RESTFUL API 最大的特点。其中比较典型的就是HTTP协议。
关于rest 的思想,有兴趣的同学可以参考阅读以下文章
理解本身的REST架构风格
http://www.infoq.com/cn/articles/understanding-restful-style/
理解RESTful架构
http://www.ruanyifeng.com/blog/2011/09/restful.html
Restful API设计指南
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
二、ThinPHP5(以下简称TP5)RESTFUL API 开发流程及注意点
**1. 设置API Route **
在TP5 中通过route.php 即可进行路由的操作,出于安全和代码迭代考虑,应注意以下点:
添加API 版本目录
指定路由访问方式 get/post
接口参数过滤
API 路由接口分组
示例代码 :
//Route::rule('路由表达式', '路由地址', '请求类型', '路由参数(数组)', '变量规则(数组)'); Route::get('api/:version/Theme/:id', 'api/:version.Theme/getComplexOne',[],['id'=>'\d+'] );
2.编写控制器
示例代码:
/* * 获取product * @url /theme/:id */ public function getComplexOne($id){ //调用自定义验证 (new IDMustBePostiveInt())->goCheck();//着重点 //调用模型操作方法 $theme = ThemeModel::getThemeWithProducts($id); if (!$theme){ //抛出自定义异常 throw new ThemeException();//着重点 } return $theme; }
通过MVC的架构和基于TP5提供 Validate 和 Exception 编写的 自定义验证 和 错误反馈,只需要通过寥寥几行代码,就可以完成控制器逻辑的编写,这无论对工作量来说,还是以后调优以及代码的可阅读性,都是大大的提高,下面着重说一下,自定义验证 和 错误反馈
3.编写自定义验证类 Validate
目录结构:
示例代码:
IDMustBePostiveInt.php
编写自定义验证器,如这个验证器为ID必须是正整数,在任何需要ID验证时就都可以使用。
namespace app\api\validate; class IDMustBePostiveInt extends BaseValidate { protected $rule = [ 'id' => 'require|isPositiveInteger', ]; protected $message = [ 'id' => 'id必须是正整数' ]; }
BaseValidate.php
编写自定义验证器,可以扩展TP5验证库,主要存放公用的验证方法,方便调用。
namespace app\api\validate; use think\Validate; class BaseValidate extends Validate { //进行参数校验 public function goCheck() { // 获取http参数 //参数校验 $request = Request::instance(); $params = $request->param(); $result = $this->batch()->check($params); if (!$result) { $e = new ParameterException([ 'msg' => $this->error, /*'code'=> 400, 'errorCode' => 1002*/ ]); throw $e; } else { return true; } } //判断是否是正整数 protected function isPositiveInteger($value, $rule = '', $data = '', $field = '') { if (is_numeric($value) && is_int($value + 0) && ($value + 0) > 0) { return true; } else { return false; } } }
在日常工作中,通过会使用到参数验证,这一点在API开发中尤为重要,可以大大提高接口的安全性,但是往往TP5自带的Validate 验证方法是不够的,通过编写验证器扩展,可以圆满的补充这一点,而且也大大提高了代码的复用性,减少了工作量。
4.编写自定义错误类 Exception
文件结构:
示例代码:
ThemeException .php
自定义错误类,可指定返回的错误信息
namespace app\lib\exception; class ThemeException extends BaseException { // HTTP 状态码 400,200 public $code = 400; // 错误信息 public $msg = '请求的主题不存在'; //自定义错误码 public $errorCode = 30000; }
BaseException .php
存放默认反馈信息,通过动态修改其中的默认信息,达到动态反馈的效果。
namespace app\lib\exception; use think\Exception; class BaseException extends Exception { // HTTP 状态码 400,200 public $code = 400; // 错误信息 public $msg = '参数错误'; //自定义错误码 public $errorCode = 10000; public function __construct($params = []) { if (!is_array($params)) { return; // throw new Exception('参数必须是数组'); } if (array_key_exists('code', $params)) { $this->code = $params['code']; } if (array_key_exists('msg', $params)) { $this->msg = $params['msg']; } if (array_key_exists('errorCode', $params)) { $this->errorCode = $params['errorCode']; } } }
在API开发中,接口的错误反馈尤为重要,可以为产品提供更准确的信息,通常与之相对应的还有一张API反馈信息表,通过查询该表,前端人员可以快速有效的找准错误。而对服务器本身的错误而言,通常是不需要反馈给客户端的,通过编写自定义反馈类,也可以做到这一点。
5.编写模型及关联
示例代码:
Theme.php
作用:编写关联模型和数据库逻辑操作,指定需要查询的字段,等等。
namespace app\api\model; class Theme extends BaseModel { //关联模型 public function topicImg(){ return $this->belongsTo('Image','topic_img_id','id'); } public function headImg() { return $this->belongsTo('Image','head_img_id','id'); } public function products(){ return $this->belongsToMany('product','theme_product','product_id','theme_id'); } public static function getThemeWithProducts($id){ //使用关联模型查询 $theme = self::with('products,topicImg,headImg')->find($id); return $theme; } }
BaseModel .php
作用:存放公用的模型修改方法,在这里为imgUrl的前缀修改。
namespace app\api\model; use think\Model; class BaseModel extends Model { //读取更改img模型的url值--读取器 protected function prefixImgUrl($value,$data){ $finalUrl = $value; if ($data['from'] == 1) { $finalUrl = config('setting.img_prefix').$value; } return $finalUrl; } }
Image.php
指定对ImageUrl前缀。
namespace app\api\model; class Image extends BaseModel { //隐藏不需要返回的字段 // protected $hidden = ['delete_time','id','update_time','from']; protected $visible = ['url']; //读取更改img模型的url值--读取器 public function getUrlAttr($value,$data){ return $this->prefixImgUrl($value,$data); } }
至此,一个结构优美,代码复用性高的API开发大框就出现规模了,篇幅有限,有许多小的知识点如SerService层,Token 编写,缓存等就不在一一赘述。
猜你喜欢
- 【PHP】ThinkPHP5.0 Restful API 开发
- 一、要学习什么是 RESTful API 首先我们得明白什么是REST?简单来说:REST是所有Web应用都应该遵守的架构设计指导原则。 英文全词Representational State Transfer,翻译是”表现层状态转化”。面向资源 是REST最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。(7个HTTP方法:GET
- 【PHP】PHP异步协程开发:加速数据存储与检索的效率
- 随着互联网应用规模和用户数量的不断增加,对于数据存储与检索的需求也愈发显著。传统的数据存储方式使用单线程阻塞 I/O 模型,无法满足海量数据的快速存储和检索需求。而采用异步协程开发模式,可以实现高效数据存储与检索,加速应用响应速度,提高系统的性能和稳定性。PHP 是一门广泛使用的编程语言,它在 Web 开发中有着广泛的应用场景。PHP 7 在语言内新增了异步协程支持,使得 PHP 开发人员可以更加方便的运用异步编程。下面将介绍 PHP 异步协程开发在数据存储和检索中的应用。一、基于 S
- 【PHP】php逻辑测试,测试也要设计—phpunit实践
- 概述本文阐述如何利用面向对象的思想,在phpunit框架下实现测试用例、数据文件、配置信息和lib库等信息分离,并能有效组合。也许有些QA认为,测试代码只要能满足测试要求即可,根本不需要有什么设计的理念。其实不然,好的测试代码,应该是可读性强,可扩展性强。以下分享一个我在实际项目中的小想法来阐述这个观点,仅作抛砖引玉之用。具体实现在autoFunc测试目录下,创建conf、data、lib三个目录,分别用于保存配置信息、数据文件和lib库,测试用例直接放在autoFunc下。A 方案直接在tes
- 【PHP】php后端搜索插件有哪些
- php后端搜索插件有Elasticsearch、Solr、Sphinx、Algolia、MySQL全文搜索等等。详细介绍:1、Elasticsearch,提供了强大的全文搜索功能,可以快速地处理大量的数据,并支持复杂的查询和过滤;2、Solr,提供了全文搜索、分布式搜索和面向文档的搜索功能,Solr具有高性能和可扩展性,并支持多种查询语法和过滤器;3、Sphinx等等。本教程操作系统:windows10系统、PHP8.1.3版本、Dell G3电脑。PHP后端搜索插件是一种用于在网站或
- 【PHP】php怎么将汉字转为拼音
- PHP是一种非常流行的服务端脚本语言,它具有灵活、快速、安全等优点,因此被广泛应用于Web开发、互联网应用和企业级软件开发等领域。而将汉字转为拼音是一个常见的需求,特别是在中文搜索、排序、筛选等场景下,可以提高用户体验和检索准确性。本文将介绍如何使用PHP实现将汉字转为拼音的方法。一、使用PHP拓展PHP中有一个名为pinyin的拓展,通过它可以很方便地将汉字转为拼音。首先需要在php.ini文件中开启拓展,找到下面这行并取消注释,保存并重启PHP服务:extension=pinyin.so登录
- 【PHP】PHP设计模式大全与应用场景
- 面向对象编程的基本原则:1、单一职责:一个类,只需要做好一件事情。2、开放封闭:一个类,应该是可扩展的,而不可修改的。3、依赖倒置:一个类,不应该强依赖另外一个类。每个类对于另外一个类都是可替换的。4、配置化:尽可能的使用配置,而不是硬编码。5、面向接口编程:只需要关心接口,不需要关心实现。1、单例设计模式所谓单例模式,即在应用程序中最多只有该类的一个实例存在,一旦创建,就会一直存在于内存中!单例设计模式常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接。一个单例类应具
- 【PHP】php解析大量数据json文件方式
- 1. 在处理超大文件时,我们可以使用逐行读取的方式来解析JSON数据。具体步骤如下:打开文件并逐行读取数据。每次读取一行数据后,使用json_decode()函数将其解析为JSON对象。对解析后的JSON对象进行处理,例如提取需要的数据或进行其他操作。继续读取下一行,重复步骤2和步骤3,直到文件读取完毕。下面是一个示例代码,演示了如何使用以上步骤来解析超大JSON文件:$file = fopen('large_file.json', 'r&#
- 【PHP】REST API是什么
- API的分类REST API(restful)REST是Representational State Transfer(表现层状态转移)的缩写,它是由罗伊·菲尔丁(Roy Fielding)提出的非 REST API(restless)REST API发送请求进行 CRUD 哪个操作由请求方式来决定同一个请求路径可以进行多个操作请求方式会用到 GET/POST/PUT/DELETE非 REST API请求方式不决定请求的 CRUD 操作一个请求路径只对应一个操作一般只有 GET/POST使用js