Lumen 自己设计的版本管理
起初准备使用的lumen + dingo 进行版本管理,发现没有我想的思路来的灵活实用,所以自写了一个中间件进行控制器地址替换,下面主要讲解下实现方法
接收header
参数,键为apiVersion
值为 v1,v2...vN
的格式(版本号由后端与客户端协调一致即可)
例如:
路由查找实现
这个时候我们的路由还是按照原样该怎么写就怎么写,拿个登录做例子
这里有第三个参数,是否使用版本控制
这个时候如果客户端输入
v2
的版本号
代码会优先在v2
版本下进行查找类是否存在,存在查找方法,不存在的时候会减一查找v1
,再找不到会在最初的版本进行返回
具体实现如下:private function getVersionLocation(&$action) { try { $v = $_SERVER['HTTP_APIVERSION'] ?? "v0"; $Version = (int)str_replace(['V','v'],'',$v); //小于或等于1 走初始版本的控制器 if ($Version > 0){ $currentRouteName = $action["uses"]; //获取当前路由名称 [$controllerStrAll, $method] = explode('@', $currentRouteName); $lastLocation = strripos($controllerStrAll,'\\'); $controller = substr($controllerStrAll,$lastLocation+1); $controllerNameSpace = substr($controllerStrAll,0,$lastLocation); if ($Version > 100) $Version = 100;//最大100 防止参数乱写 for ($i=$Version;$i>0;$i--){ $v = 'v'.$i; $controllerLocation = $controllerNameSpace.'\\'.$v.'\\'.$controller; if (class_exists($controllerLocation)) { if (method_exists($controllerLocation,$method)) { $action["uses"] = $controllerLocation.'@'.$method; return; } } } } }catch (\Throwable $t){ Log::error('version_location error:'.$t); } }
首先重写app下面的router变量类
位置bootstrap/app.php
文件下
把原有的类复制过来,做部分修改
本作品采用《CC 协议》,转载必须注明作者和本文链接