开发语言: PHP7+
开发框架: Laravel
以前也对接过 app
,每次更新版本时,并不考虑兼容以前版本的问题,当有新版本更新时,在客户端直接强制更新,否则会退出。
刚刚接手的 app
有了这个需求,需要保留以前的版本,这样对不想更新的用户来说,体验会更友好。
多版本有很多解决方案,我直接用 laravel
框架将我自己的方案写出来,供大家参考。
大体上需要改动4个地方
- 在
routes
文件夹下添加规则为app_1.php
、app_2.php
这样的路由文件 - 在
Controllers
控制器文件夹下添加V1
,V2
文件夹 - 获取客户端自定义的
header
头部字段X-version-code
- 修改
RouteServiceProvider
文件
写到这里,相信大家应该了解了我的思路,下面开始一步步解释。
新建路由文件
新建一个路由文件 api_1.php
,内容如下
Route::group(['namespace' => 'V1'], function () {
// 这里写路由
});
命名空间 V1
对应控制器 V1
文件夹,这样当有请求时,会自动找到指定版本的控制器
判断客户端版本号
X-version-code
是客户端自定义的字段,表示当前客户端的版本号。而版本号是有服务端返回为客户端的。
-
在
RouteServiceProvider
的mapApiRoutes
方法中添加如下代码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
最新的版本,也就是最新的路由文件:
获取方式见 2 -
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,表示需要更新。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。