Lumen 自己设计的版本管理

起初准备使用的lumen + dingo 进行版本管理,发现没有我想的思路来的灵活实用,所以自写了一个中间件进行控制器地址替换,下面主要讲解下实现方法

接收header参数,键为apiVersion 值为 v1,v2...vN的格式(版本号由后端与客户端协调一致即可)

例如:

Lumen 自己设计的版本管理

路由查找实现
这个时候我们的路由还是按照原样该怎么写就怎么写,拿个登录做例子
Laravel
这里有第三个参数,是否使用版本控制

Lumen 自己设计的版本管理

这个时候如果客户端输入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文件下

Lumen 自己设计的版本管理

把原有的类复制过来,做部分修改

Lumen 自己设计的版本管理

Lumen 自己设计的版本管理

Lumen 自己设计的版本管理

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

file 无入侵系统,route添加相关参数,由中间件处理对应逻辑,上述就是使用中间件判断是否公开地址

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!