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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

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

4年前 评论

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