# 前言
*****
### 在使用<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',
];
```
接下來看一下目錄結構

其中 <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

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

至此,已經完成了最簡單的通過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完全開發手冊之路由篇 http://www.hmoore.net/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)
+ 微信交流
