# 前言
*****
### 在使用<code>Thinkphp</code>接口开发项目的程中可能会遇到这样的场景
+ 准备将原有系统重构一遍,但是出于某种原因,老的系统在未来一段时间内必须和新的版本共存;
+ APP存在老版本不能强制升级,所以服务端接口需要同时兼容新老客户端同时正常使用;
+ 其他更多需要新老兼容的场景
如果只是在一套接口中做特殊判断,将会变得非常难维护。所以更好的方法是进行版本管理。本文主要分享通过URL路由方式来达到版本控制。
在实际的开发中不同的版本方法名基本上都是一样的。以用户注册接口为例,
方法名都是: <code>register</code>
>[success] 两个版本通过以下url访问,URL格式:域名/模块名/版本号/控制器/方法名
```
v1版本:http://www.tp5.com/api/v1/user/register
v2版本:http://www.tp5.com/api/v2/user/register
```
首先我们在<code>route.php</code>文件中定义好路由规则
```php
<?php
return [
'api/:version/:controller/:function' => 'api/:version.:controller/:function',
];
```
接下来看一下目录结构
![](https://box.kancloud.cn/e3687e23b9f58cc496be15ff58e96987_543x634.png)
其中 <code>application/api/controller/v1/User.php</code> 中文件代码如下
```php
<?php
namespace app\api\controller\v1;
class User
{
public function register()
{
dump('我是v1版本的register方法');
}
}
```
其中 <code>application/api/controller/v2/User.php</code> 中文件代码如下
```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版本控制的思路
+ 通过域名路由 <code>v1.api.tp5.com</code> <code>v2.api.tp5.com</code> 在<code>route.php</code>中获取对应版本标识并路由到应控制器文件中
+ 在header中传入<code>version</code>参数,并<code>route.php</code>中获取对应值再路由对应控制器文件中
+ 直接将版本号作为参数传入进行路由~
实际上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)