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