因为接手APP版本代码是外包的作品thinkphp3.1,所以里面的代码有点杂乱,加之后台版本为tp5.0,所以这次就考虑到app版本也升级成tp5的了。
说完前提,在来描述先需求:
A用户在1.0版本APP中使用,API升级之后要求原本的版本可以继续使用。
就是说当A用户在原来的1.0版本的APP中可以继续使用,重新在应用商店下的1.1版本也要可以继续使用。
假设A 在v1.0修改用户信息接口中提交了user_name,sex,birthday三个字段
但是根据需求调整了APP之后 在v1.1版本中用户需要提交 user_name,address,phone 三个字段
且需要保证用户在2个版本中都可以提交这些信息并进行保存。
这里就是标题提到的版本兼容问题了。
思路:
在代码中做路由处理,根据传递的版本号来路由到不同的控制器。
在tp5中很大的改动就是路由模块,功能也确实很强大。
所以在路由文件中做了路由分发请求到对应的控制器,而目录结构对应的就是
应用部署目录
├─application 应用目录(可设置)
│ ├─common 公共模块目录(可更改)
│ ├─index 模块目录(可更改)
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ │ ├─v1_0 v1.0 控制器目录
│ │ │ ├─v1_1 v1.1 控制器目录
...
考虑到app独立出来之后后台管理并不在一个项目,所以可用单模块来优化目录结构,即不需要Index这一层目录
需要在配置文件中修改
// 是否支持多模块
'app_multi_module' => false,
应用部署目录
├─application 应用目录(可设置)
│ ├─common 公共模块目录(可更改)
│ ├─config.php 模块配置文件
│ ├─common.php 模块函数文件
│ ├─controller 控制器目录
│ │ ├─v1_0 v1.0 控制器目录
│ │ ├─v1_1 v1.1 控制器目录
...
然后做路由指向对应的版本,这里因为APP请求时定义HTTP_VERSION版本了,所以直接获取就好的
$version = \think\Request::instance()->header('version');
$version = $version ? 'v' . str_replace('.', '_', $version) : 'v2_1_1';
return [
'' => $version . '.index/index',
':controller$' => $version . '.:controller/index',
':controller/:function$' => $version . '.:controller/:function',
];
路由这里遇到一个问题:第三方类的接口建议独立出来,并不随版本改动。
虽然上面的这种做法的弊端就是每次更新版本的时候,就是复制一个上一版本,然后再这个基础上进行改动。不过暂时没有好的办法做兼容,有好的方法的朋友留个言分享下。
PS 项目更新之后接入了 Redis 缓存用户信息,MongoDb 存储日志,Aliyun OSS 做资源处理,所以学习的还是很多的。边工作边学习!
PS IDE对自己写的代码作用真的很大,类库名字敲出来就自动引入,写完格式化下代码,是真心快。
上一篇: 平均分配订单...
下一篇: thinkphp生成二维码...