php+tp框架+API,【路由】利用Thinkphp路由实现API开发版本管理

# 前言

*****

### 在使用Thinkphp接口开发项目的程中可能会遇到这样的场景

+ 准备将原有系统重构一遍,但是出于某种原因,老的系统在未来一段时间内必须和新的版本共存;

+ APP存在老版本不能强制升级,所以服务端接口需要同时兼容新老客户端同时正常使用;

+ 其他更多需要新老兼容的场景

如果只是在一套接口中做特殊判断,将会变得非常难维护。所以更好的方法是进行版本管理。本文主要分享通过URL路由方式来达到版本控制。

在实际的开发中不同的版本方法名基本上都是一样的。以用户注册接口为例,

方法名都是: register

>[success] 两个版本通过以下url访问,URL格式:域名/模块名/版本号/控制器/方法名

```

v1版本:http://www.tp5.com/api/v1/user/register

v2版本:http://www.tp5.com/api/v2/user/register

```

首先我们在route.php文件中定义好路由规则

```php

return [

'api/:version/:controller/:function' => 'api/:version.:controller/:function',

];

```

接下来看一下目录结构

![](https://box.kancloud.cn/e3687e23b9f58cc496be15ff58e96987_543x634.png)

其中 application/api/controller/v1/User.php 中文件代码如下

```php

namespace app\api\controller\v1;

class User

{

public function register()

{

dump('我是v1版本的register方法');

}

}

```

其中 application/api/controller/v2/User.php 中文件代码如下

```php

namespace app\api\controller\v2;

class User

{

public function register()

{

dump('我是v2版本的register方法');

}

}

```

## 接下来我们使用postman工具模拟请求 v1和v2版本的url

### v1版本http://www.tp5.com/api/v1/user/register

![](https://box.kancloud.cn/6d9bc1c61b16532c48f8f865ffd398d9_610x491.png)

### v2版本http://www.tp5.com/api/v2/user/register

![](https://box.kancloud.cn/0be6c461941242a784a137f978841395_545x505.png)

至此,已经完成了最简单的通过thinkphp5路由规则实现API的版本控制,是不是非常简单呢?

> 其他API版本控制的思路

+ 通过域名路由 v1.api.tp5.com v2.api.tp5.comroute.php中获取对应版本标识并路由到应控制器文件中

+ 在header中传入version参数,并route.php中获取对应值再路由对应控制器文件中

+ 直接将版本号作为参数传入进行路由~

实际上thinkphp的路由规则远比想象的要强大灵活很多,建议多阅读官方ThinkPHP5.1完全开发手册之路由篇 https://www.kancloud.cn/manual/thinkphp5_1/353960 ,希望大家可以结合自己的业务场景充分利用路由的功能让URL更规范以及优雅,也可隐式传入额外请求参数,让自己的系统更加安全,优雅!

## 开发帮助及交流

如您对本文感兴趣想与我联系交流 您可以

+ 邮件至:xieyongfa@ecarde.cn

+ QQ:2392523899 [点我聊天](http://wpa.qq.com/msgrd?v=3&uin=2392523899&site=qq&menu=yes&from=message&isappinstalled=0)

+ 微信交流

![](https://box.kancloud.cn/b74285a950ce81e3cb782f02eb118d59_752x974.jpg =300x389)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter命令行运行-分布式测试

秒秒开心jmeter命令行运行-分布式测试 上一篇文章我们说到了jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存、cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要…

水龙吟

人长是、多怨我,怎如今、情词穷尽。文墨浅薄,一字不题,忧恨难泄。闻说古今,才子佳人,难成双美。柳七一句,玉萧声断。 人已去、玉长在,莽匹夫、世故笑,轮转境台空觅梦。乱言疯语,一大快事,还看此篇。醉也未极,到梦中戏猴…

ambari 自定义组件安装

借鉴:http://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari3/index.htmlAmbari 在启动的时候,会扫描 resource 目录下 Stack 下面的 service 配置。也就是每个 Service 的 metainfo.xml,同时会将这些配置信息放在自己的数据…

php 303,HTTP 的重定向301,302,303,307(转)

301 永久重定向,告诉客户端以后应从新地址访问.302 作为HTTP1.0的标准,以前叫做Moved Temporarily ,现在叫Found.现在使用只是为了兼容性的处理,包括PHP的默认Location重定向用的也是302.但是HTTP 1.1 有303 和307作为详细的补充,其实是对302的细化303:对于POST请求…

android 蓝牙各种UUID (转)

ServiceDiscoveryServerServiceClassID_UUID {00001000-0000-1000-8000-00805F9B34FB} BrowseGroupDescriptorServiceClassID_UUID {00001001-0000-1000-8000-00805F9B34FB}PublicBrowseGroupServiceClass_UUID {00001002-0000-1000-8000-00805F9B34FB} #蓝牙串口服务Serial…

android 双向滑动 seekbar

实现原理:1、自定义View,在onDraw(Canvas canvas)中,画出2个Drawable滑动块,2个Drawable滑动条,2个Paint(text)2、监听onTouchEvent()事件,修改滑块和滑动条的坐标,调用i…

java的算术表达式程序,java计算数学表达式

import java.util.EmptyStackException;import java.util.Stack;public class CaculateFunction {private static String[] TrnsInToSufix(String IFX)// PFX放后缀表达式,IFX为中缀表达式{String PFX[] new String[IFX.length()];StringBuffer numBuffer new Str…

java开发区块链只需150行代码

本文目的是通过java实战开发教程理解区块链是什么。将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等。这个基本的java区块链也实现简单的工作量证明系统。本文用一个java例子,演示了开发一个区块链应用的过程,涉…

关于Linux的总结(三)

1.man_page.txt 1.内部命令:echo 查看内部命令帮助:help echo 或者 man echo2.外部命令:ls 查看外部命令帮助:ls --help 或者 man ls 或者 info ls3.man文档的类型(1~9) man 7 man man 5 passwd4.快捷键: ctrl c&…

按钮长按

2019独角兽企业重金招聘Python工程师标准>>> 用update来实现定时 //长按处理update: function (delta) {cc.log("update "delta);this.totalTimedelta;if(this.totalTime>TOUCH_LONG_TIMER_INVOKE){this.stopTimer();this.invokeTouchLong();}},stop…

php email 发送,php 发送 Email

require("mail/class.phpmailer.php");//调用$mail new PHPMailer();//实例化phpmailer$address "mailxi126.com";//接收邮件的邮箱$mail->IsSMTP(); // 设置发送邮件的协议:SMTP$mail->Host "smtp.163.com"; // 发送邮件的…

Git-如何将已存在的项目提交到git

1.首先在码云或者github上创建一个不带README.md的项目,然后复制远程库的地址(下面以码云为例):   2.进入本地已存在的项目目录:house    touch README.md //新建说明文件 git init //在当前项目目录中生成本地git…

Bash:字符串操作

参考:http://blog.csdn.net/finewings/article/details/5718133 字符串提取 去掉指定前缀 1. ${varible#pattern} 从头开始,左往右,删除最短的一个pattern结尾的字符串,即截取第一个pattern结尾子串之后的字符串 例…

ggplot2 theme相关设置—文本调整

在geom设置和scale设置之后,要想把图画的漂亮,theme设置是比不可少的 在theme 设置中element_text()是一项很重要的内容 element_text(family NULL, face NULL, colour NULL, size NULL, hjust NULL, vjust NULL, angle NULL, lineheight NULL) …

java top.dialog控件,java – 如何只为他的父级创建JDialog onTop?

可以说,我们有几个JFrame窗口同时可见,并且每个窗口都出现JDialog.当我们的窗口处于级联模式和对话框setAlwaysOnTop为真时,所有对话框将在最后一个窗口中可见.我只想将Dialog组件与其所有者关联起来,这样当你在Frames之间切换时,你只会在顶部获得一个对话框,并且在单击一个框架…

Eclipse出现the type java.lang.CharSequence can't be resolved.

出现这个问题我们需要安装一下JRE1.7这个版本,然后再项目里引入一下就可以了。 转载于:https://www.cnblogs.com/ganwei/p/4565883.html

php system 返回值127,php system 返回值 1

PayPal新的IPN返回接口(PHP)_计算机软件及应用_IT/计算机_专业资料。今天调试个客户的PayPal IPN返回接口死活不正确,用自己的老帐号和sandbox,都没问题,开始怀疑他......2.ob_start()还有一个不太明显但很致命的后门用法,实现代码如 2 9 ■ 1234 <?php /* 例 7*/$cmd sy…

window10 mysql5.7 解压版 安装

1. 解压mysql-5.7.11-winx64.zip 到某文件夹&#xff0c; 如C:\DevelopCommon\mysql-5.7.11-winx64。 2. 配置环境变量 变量名 &#xff1a; MYSQL_HOME 变量值 &#xff1a; C:\DevelopCommon\mysql-5.7.11-winx64 -------------- 变量名 &#xff1a; Path 变量值 &#xff…

Vmware中的centos虚拟机克隆之后没有eth0

克隆虚拟机之后&#xff0c;CentOS没有eth0的解决办法 我们常常需要从一台已经安装完成的虚拟机系统克隆出来一个新系统&#xff08;克隆时候必须要改变网卡物理地址&#xff0c;这一点无需多说&#xff09;&#xff0c;但是新系统启动之后&#xff0c;会发现系统网络工作不…

reset.css

body{margin:8px;} iframe{border:2px;} th,td{padding:1;} table{border-spacing:2px;border-collapse:separate;} dfn{斜体} <dfn> 标签可标记那些对特殊术语或短语的定义。 现在流行的浏览器通常用斜体来显示 <dfn> 中的文本。将来&#xff0c;<dfn> 还可…