開發語言: PHP7+
開發框架: Laravel php
之前也對接過 app
,每次更新版本時,並不考慮兼容之前版本的問題,當有新版本更新時,在客戶端直接強制更新,不然會退出。
剛剛接手的 app
有了這個需求,須要保留之前的版本,這樣對不想更新的用戶來講,體驗會更友好。 laravel
多版本有不少解決方案,我直接用 laravel
框架將我本身的方案寫出來,供你們參考。數據庫
大致上須要改動4個地方api
routes
文件夾下添加規則爲 app_1.php
、app_2.php
這樣的路由文件Controllers
控制器文件夾下添加 V1
,V2
文件夾header
頭部字段 X-version-code
RouteServiceProvider
文件寫到這裏,相信你們應該瞭解了個人思路,下面開始一步步解釋。數組
新建一個路由文件 api_1.php
,內容以下app
Route::group(['namespace' => 'V1'], function () { // 這裏寫路由 });
命名空間 V1
對應控制器 V1
文件夾,這樣當有請求時,會自動找到指定版本的控制器框架
X-version-code
是客戶端自定義的字段,表示當前客戶端的版本號。而版本號是有服務端返回爲客戶端的。ide
在 RouteServiceProvider
的 mapApiRoutes
方法中添加以下代碼this
protected function mapApiRoutes() ~~~~ { $versionCode = request()->header('X-version-code') ?? AppService::getLatestRoute(); $routeFile = ! $versionCode ? 'api_1.php' : ('api_' . $versionCode . '.php'); Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/' . $routeFile)); }
$versionCode
是從 header
頭部獲取到的版本號;
若是客戶端沒有及時更新,那麼咱們就能夠直接獲取 header
中 X-version-code
的版本號;
若是是第一次下載,咱們須要獲取 app
最新的版本,也就是最新的路由文件:
獲取方式見 2spa
AppService::getLatestRoute()
方法獲取最新版本號
// AppService.php public static function getLatestRoute() { $files = glob(base_path('routes') . '/api*.php'); // 獲取路由文件的文件名 $tmp = array_map(function ($item) { return pathinfo($item)['filename'] ?? ''; }, $files); // 對數組中的文件名進行倒敘排列 rsort($tmp); return explode('_', current($tmp))[1] ?? ''; }
app
的最新版本號。假設接口中的版本號爲 A
,存到客戶端本地的版本號爲 B
若是 A > B,表示須要更新。