《细说PHP》第四版 样章 第23章 自定义PHP接口规范 9
23.5.3 WebAPI框架应用
程序框架其实就是一个半成品项目,在应用框架时,核心的服务程序只应用,不需要改动。当然如果有必要,也可以根据项目的需要对框架进行二次开发。本节内容主要基于我们的框架,完成对WebAPI的访问交互。例如,现在有这样一个简单需求,在客户端PHP程序中,需要通过我们自定义的API对远端数据库中的表user(使用本章前面介绍过的表user),进行增、删、改、查等操作。
首先,我们需要在服务器中创建一个user表的操作模型类,通过统一的操作模型对表进行管理。当然,对表操作的数据访问模型可以编写得很“智能”,本例只是为了完成效果,用最简单的方法实现对表user的操作。在项目的根目录创建一个“models”目录,对每个表的操作都在这个目录中创建一个单独的操作类。根据需求只需要对一个表user进行操作,所以只需要在该目录下创建一个user.php的文件,并在文件中声明一个User类。另外,对每个数据表操作的模型类,都需要先连接数据库,所以可以先声明一个父类,把所有共性的表操作都在这个父类中声明。本例只将数据库的连接操作看作共性问题,放在根目录model.php文件声明的Model类中,代码如下所示:
Model类作为所有数据模型的父类,通过connect()方法加载配置文件config.php,根据数据库配置信息连接到数据库,可以让所有子类调用该方法,并完成对数据库的连接操作。我们在models目录中创建的user.php文件,声明的User类继承了Model类,代码如下所示:
在User类中只声明一些对表user进行增、删、改、查的操作方法,如果需要对其他表进行同样的操作,可以再声明一些同样的类文件。User类中的这些方法,可以在控制器中通过创建User类的对象直接进行访问。同样,每个业务操作流程也需要声明一个独立的控制器文件。控制器和其中的操作方法,是通过我们定义的框架,在路由表中和用户的操作请求绑定的。根据用户不同的操作请求,通过路由映射到控制器中对应的方法。按本例的需求,创建一个目录“controllers”,并在该目录下声明一个usercontroller.php文件,并在文件中声明一个UserController类,代码如下所示:
如果有其他的业务需求,可以按本类的格式,再继续添加新的控制器。在本类中声明一些通用操作方法,通过创建数据操作模型User类对象,对表user进行操作,将运行结果再通过Response类返给客户端。
有了控制器,下一步就需要编辑api.php文件中的路由表,将我们声明的接口发布出去。注册路由表信息如下所示:
如果整个项目文件已经上传到Web根目录下,按RESTful API的要求,需要一个独立的域名空间。可以在本机进行简单测试,通过修改Windows系统下的hosts文件,添加一条记录,将域名api.itxdl.cn指定到本机“127.0.0.1”。打开“C:/Windows/System32/drivers/etc/hosts”文件,在最后一行加一条记录,如下所示:
添加完成后直接保存即可生效,当然只能在本机测试使用。可以通过域名提供商购买,并将域名指向自己的服务器地址,也可以在Linux下通过配置DNS服务实现。现在访问API的URL为:
https://api.itxdl.cn/index.php/v1/资源名称?参数
按RESTful API的规范,还需要隐藏主入口文件index.php。这可以通过Web服务器Apache提供的URL rewrite扩展模块实现。在index.php文件所在的同级目录下(本例在Web文档根目录下),创建 “.htaccess”文件,添加几条Apache URL重写指令来实现,文件“.htaccess”的内容如下所示:
文件编辑完成后不用重新启动Web服务器即可生效,如果主入口文件不是放在Web服务器的根目录下的,只需要在第三条index.php前加上所在的路径即可。现在访问API的URL为:
https://api.itxdl.cn/v1/资源名称?参数
到现在自定义的简单API已经开发完成,如果让客户端访问,还需要提供详细的API文档。可以通过www.showdoc.cc平台注册一个账号来管理文档,我们通过简单的表格编写部分自己定义的API文档,如表23-6所示。
表23-6 自己定义的API文档
《细说PHP》第四版 样章 第23章 自定义PHP接口规范 9的更多相关文章
- 《细说PHP》第四版 样章 第二章 PHP的应用与发展 1
<细说PHP>第四版 样章 第二章 PHP的应用与发展 1 学习任何编程语言之前,先了解一下它的应用与发展是很有必要的.从Web开发的历史看来,PHP.Python和Ruby几乎是同时出现 ...
- 《java编程思想(第四版)》第一二章学习笔记
目录 一.Introduction 1.抽象过程 2.面向对象语言(包括Java)的五个基本特性 3.每个对象都提供服务 4.public.private.protected三者的区别 5.Java的 ...
- 《细说PHP》 第四版 样章 第二章 PHP的应用与发展 5
2.5 如何学习PHP PHP以其简单易学的特点,以及敏捷开发的优势,从一个几乎不被人知的开源项目,慢慢成长为技术人员首选的动态Web设计工具,与其他语言相比,PHP表现得更好.更快.更简单易学.尽 ...
- 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 11
23.6 使用第三方接口服务实例 接供服务的第三方接口平台有很多,现在的项目中也经常用到一些第三方接口,如支付宝.微信.短信.邮件接口等,我们需要借助第三方的能力来实现产品的某些功能.如果自己已经掌 ...
- 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 8
23.5.2 架构详解 本例的实现最重要的就是服务层的设计,有两个配置文件config.php和api.php,其中文件config.php是全局的配置文件,用于整个程序全局需要的参数设置.可以根据 ...
- 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 6
23.4 API的设计原则和规范 API是服务提供方和使用方之间对接的通道,前面我们设计的一些简单API的例子,基本上比较随意,没有使用任何规范.设想一下,每个平台都可能存在大量的API,如果API ...
- 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 3
23.2 接口实现的基础 大家都很了解函数在本地应用,通过名称调用函数执行,并通过传递不同参数,函数有不同执行,执行后给调用者返回结果.如果把一个函数做成一个接口远程访问,也需要这几个步骤.使用HT ...
- 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 1
如今的项目开发中,接口是很普遍的应用技术.现在好多项目组都单独设有接口开发人员.像腾讯.微博.淘宝等开放平台,其所谓的开放,就是提供一些可调用的接口,用于获取相关的信息.例如,微信用户基本信息.淘宝店 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12
18.9 管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PD ...
随机推荐
- Linux tree
tree命令,是大小写敏感的.常用的是:1.tree -C 颜色显示 2.tree -f 显示文件全路径ls -R也可以显示树结构,但没上面 清晰 3.tree -L n n 是数字,表示显示几层 4 ...
- 011.MongoDB性能监控
一 MongoDB 监控 1.1 监控概述 MongoDB自带了mongostat 和 mongotop 这两个命令来监控MongoDB的运行情况.这两个命令用于处理MongoDB数据库变慢等等问题非 ...
- 基于 Unity 的一种透明通道压缩处理
由于 Android 平台各种硬件标准的不统一,为了开发的软件项目能够在大部分 Android 机上完美运行,我们需要以较差的硬件支持为基础做准备. Android 平台基本上都支持对不带 Alpha ...
- Vue+Vuex初体验
首先: 安装vuex npm install vuex -S 需要有两个组件(HelloWord.vue 和 HelloDemo.vue)[组件自定义] 注册路由 注册store 测试 一.需要有两个 ...
- Java Swing 图形界面开发
https://blog.csdn.net/xietansheng/article/details/72814492
- 《Google软件测试之道》
Google软件测试之道 Google对质量的理解 质量不等于测试,即质量不是被测出来的 开发和测试应该并肩齐驱,测试就是开发过程中不可缺少的一部分 质量是一种预防行为而不是检测 Google对软件测 ...
- UDP组播
多播(组播) 组播组可以是永久的也可以是临时的.组播组地址中,有一部分由官方分配的,称为永久组播组.永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化.永久组播组中成员的数量都可以是任意的 ...
- jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解
本节说一下DOM操作模块里的包裹元素子模块,该模块可将当前匹配的元素替换指定的DOM元素,有如下方法: wrap(html) ;在每个匹配元素的外层添加一层DOM元素 ...
- WPF customize DelegateCommand
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...
- Python实现图片的base64编码
import base64 if __name__ == "__main__": dir='image.jpg' basef=open(dir.split('.')[0]+'_ba ...