Lumen 自己設計的版本管理

WZY發表於2020-04-28

起初準備使用的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 協議》,轉載必須註明作者和本文連結

相關文章