开发语言: 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,表示须要更新。