PHP-API接口版本控制的問題

api 接口版本控制找了一下資料總共有幾種類型

  1. 不設定版本模式意味著每個API只提供一個版本,如果要修改本API, 所有的用戶都必須使用最新的API,任何API的修改都會影響到所有的用戶。
  2. API自帶版本模式同一個名稱的API可以建立多個版本,API調用方根據自己的需求選擇使用對應的API版本。新版本與老版本共存,意味著老版本用戶不會受新版本更新的影響。
  3. 兼容性版本模式每個API只有一個版本,API需要兼容以前老版本API的功能。所有版本用戶都調用同一個API,通過內在代碼保證兼容性。
    具體一些內容可以看一下介紹https://juejin.im/post/5977f8ba5188255b9a6ad820

解決版本控制有5種類型
1.url增加版本編號
http://localhost/index.php/home/v1/index/test
2.url增加版本信息
http://localhost/index.php/home/index/test/v1
3.新增接口
http://localhost/index.php/home/index/newTest
4.客戶端在做請求的時候在HTTP HEAD里面中添加API-VERSION字段,標識出請求的是哪個接口:
-H "API-VERSION: v1"
-H "API-VERSION: v2"
5.不同版本使用不同的域名,這樣:
v1.api.xxx.com
v2.api.xxx.com

以下代碼是基于TP3.2.3修改的:

用的是第一種url增加版本編號:http://localhost/index.php/home/v1/index/test

修改這個代碼做法是:url可以全部統一修改為最新版本,如果最新版本不存在會自動查找低版本的接口
在網上查找的資料都是可以用那幾種類型,沒有具體事例,下面是我自己想法修改出來的代碼。
修改的tp入口文件名 app.class.php

 /**
     * 執行應用程序
     * @access public
     * @return void
     */
    static public function exec() {
    
        if(!preg_match('/^[A-Za-z](\/|\w)*$/',CONTROLLER_NAME)){ // 安全檢測
            $module  =  false;
        }elseif(C('ACTION_BIND_CLASS')){
            // 操作綁定到類:模塊\Controller\控制器\操作
            $layer  =   C('DEFAULT_C_LAYER');
            if(is_dir(MODULE_PATH.$layer.'/'.CONTROLLER_NAME)){
                $namespace  =   MODULE_NAME.'\\'.$layer.'\\'.CONTROLLER_NAME.'\\';
            }else{
                // 空控制器
                $namespace  =   MODULE_NAME.'\\'.$layer.'\\_empty\\';                    
            }
            $actionName     =   strtolower(ACTION_NAME);
            if(class_exists($namespace.$actionName)){
                $class   =  $namespace.$actionName;
            }elseif(class_exists($namespace.'_empty')){
                // 空操作
                $class   =  $namespace.'_empty';
            }else{

                E(L('_ERROR_ACTION_').':'.ACTION_NAME);
            }
            $module  =  new $class;
            // 操作綁定到類后 固定執行run入口
            $action  =  'run';
        }else{
            //創建控制器實例  
            /****以下是修改的代碼******/
            $p =  CONTROLLER_NAME;
            $c = explode('/', $p);
            $mod = substr($c[0], 0,1);
            if ($mod!='V') {
                $action  =  $c[1];
                $p = 'V1/'.substr($p, 0,stripos($p,'/'));
            }
            if (!controller($p)) {
                $p = explode('/', $p);
                $n =  substr($p[0], 1);
                $b = 'V'.$n;
                while  (!controller($b.'/'.$p[1])) {
                    $n = --$n;
                    $b = 'V'. $n;  
                    if ($n==0) {
                        
                        break;
                    }                       
                    if (controller($b.'/'.$p[1])) {
                        $module  =  controller($b.'/'.$p[1]);
                        break;
                    }
                    
                }
            }else{ 
                // $module  =  controller(CONTROLLER_NAME,CONTROLLER_PATH);  
                $module  =  controller($p); 
                $p = explode('/', $p);
                $n =  substr($p[0], 1);
            }
                      
        }
        if(!$module) {
            if('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) {
                header("Content-type:image/png");
                exit(base64_decode(App::logo()));
            }

            // 是否定義Empty控制器
            $module = A('Empty');
            if(!$module){
                E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME);
            }
        }
        
        // 獲取當前操作名 支持動態路由
        if(!isset($action)){
            $action    =   ACTION_NAME.C('ACTION_SUFFIX');
        }
        try{
            self::invokeAction($module,$action);
        } catch (\ReflectionException $e) { 
            // 方法調用發生異常后 引導到__call方法處理
            self::isAction($n,$p,$action);
            $method = new \ReflectionMethod($module,'__call');
            $method->invokeArgs($module,array($action,''));
        }
        return ;
    }
    
    //增加判斷該方法不存在時 查找下一個控制
    public static function isAction($n,$p,$action){
            
        
        if ($n==1) {
            $module  =  controller($b.'/'.$p[1]);
            self::isController($module);
            try{
                self::invokeAction($module,$action);
            } catch (\ReflectionException $e) { 
                // 方法調用發生異常后 引導到__call方法處理
                $method = new \ReflectionMethod($module,'__call');
                $method->invokeArgs($module,array($action,''));
            }
        }    
        $b = 'V'.--$n;                  
        if (controller($b.'/'.$p[1])) {
            $module  =  controller($b.'/'.$p[1]);
            try{
                self::invokeAction($module,$action);
            } catch (\ReflectionException $e) { 
                // 方法調用發生異常后 引導到__call方法處理
                self::isAction($n,$p,$action);
                $method = new \ReflectionMethod($module,'__call');
                $method->invokeArgs($module,array($action,''));
            }
        }
        self::isAction($n,$p,$action);
 


    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376