laravel项目稳定系统如何保证兼容的同时进行持续迭代设计?
运行环境
laravel8+php7.4(提供纯api服务,对接web/安卓/ios)
情况说明
这是一个后台管理系统,有web端也有app端。在持续迭代设计上有两个痛点:
- 所有小版本迭代需要保持老版本的兼容(前端不需要强更)
- 有rbac存在,所以迭代需要继承老版本的权限,比如
order/list
接口后续不管怎么迭代已有该权限的管理员还是需要照样有该接口的权限
1.当前结构:
app
|----controller
|--------OrderControler.php
|--------UserController.php
|----service
|----model
...
auth表:
id route 1 order/list rbac权限
id 管理员id auth_id 1 1 1
当前想法
目录结构:
- 最新版本的controller继承上一版本的controller,然后有变更的接口就复写action,有新增的就直接加action
- route区分 v1/order、v2/order版本接口来兼容老接口
app |----controller |--------V1 |------------OrderControler.php |------------UserController.php |--------V2 |------------OrderControler.php |------------UserController.php |----service |----model
当前思路暴露的问题
- 每迭代一次路由就更换了一次(由v1/order变更成了v2/order),导致前端必须同步强更。如果只是web端其实影响不大,但是这个项目还有App端,尤其是小版本如此频繁的强更不切实际…
- auth表会增加历史路由,rbac权限表需要将已有v1权限的管理员将v2的权限也同步进去。甚至存在需要将已有v1权限的管理员将v3的权限同步进去(某些接口直接从v1迭代至v3的)
- 给管理员分配权限时,权限树会增加v1/v2/v3…很多历史结构,如何合理的保持干净结构
id route 1 v1/order/list 2 v2/order/list
另外一种
所有接口识别query携带version参数,根据version进行分发到底执行哪个action,但是这里在哪个位置实现分发有点别扭。我是想再route层就进行识别分发,类似于这种在最顶层入口判断分发:
Route::get('order/list',function(Request $request){
if($request->get('version')=='v3'){
调用 v3/OrderController
}else{
调用 v1/OrderController
}
});
但是在路由层写闭包写逻辑肯定是不好的,所以这种方案想了解下有没有什么基于路由全局判断自动分发的写法(或者说是在哪个位置节点能统一判断分发)。。。
最后
请问各位都是如何合理的设计这种系统持续迭代的?请不吝赐教真诚学习…[膜拜]