1

开发语言: PHP7+
开发框架: Laravel

以前也对接过 app,每次更新版本时,并不考虑兼容以前版本的问题,当有新版本更新时,在客户端直接强制更新,否则会退出。
刚刚接手的 app 有了这个需求,需要保留以前的版本,这样对不想更新的用户来说,体验会更友好。

多版本有很多解决方案,我直接用 laravel 框架将我自己的方案写出来,供大家参考。

大体上需要改动4个地方

  • routes 文件夹下添加规则为 app_1.phpapp_2.php这样的路由文件
  • Controllers 控制器文件夹下添加 V1,V2文件夹
  • 获取客户端自定义的 header 头部字段 X-version-code
  • 修改 RouteServiceProvider 文件

写到这里,相信大家应该了解了我的思路,下面开始一步步解释。

新建路由文件

新建一个路由文件 api_1.php,内容如下

Route::group(['namespace' => 'V1'], function () {
    // 这里写路由
});

命名空间 V1 对应控制器 V1文件夹,这样当有请求时,会自动找到指定版本的控制器

判断客户端版本号

X-version-code 是客户端自定义的字段,表示当前客户端的版本号。而版本号是有服务端返回为客户端的。

  1. RouteServiceProvidermapApiRoutes 方法中添加如下代码

    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 头部获取到的版本号;
    如果客户端没有及时更新,那么我们就可以直接获取 headerX-version-code 的版本号;
    如果是第一次下载,我们需要获取 app 最新的版本,也就是最新的路由文件:
    获取方式见 2

  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,表示需要更新。


大步点点
191 声望14 粉丝

There are only two things you need to be a great programmer: curiosity and kindness. Everything else you can learn over time. Everything.