美文网首页
Phalapi框架重写请求,实现小版本迭代

Phalapi框架重写请求,实现小版本迭代

作者: Ayo金彩 | 来源:发表于2019-08-08 10:13 被阅读0次

    例:/?service=App/Site/Index
    service如何获取,可查看phalapi官方文档
    如何重写请求,在哪重写请求,可查看phalapi官方文档
    请求目录结构

    请求目录结构
    composer配置
    composer配置

    functions.php的使用:\App\V1\Hello();

    版本为 1.0.0的请求方法 及 版本为 1.0.1请求到的方法

    初版和二版

    以下为具体代码实现;

    // 优先返回自定义格式的接口服务名称
    
    $header = $this->getHeader("HTTP_VERSION");//自定义版本命名
    
    //获取更新版本
    $versionArray = array_filter(explode(".",$header),function($v){if(is_null($v))return false;else{return true;}}); //array(3) {[0]=>string(1) "1",[1]=>string(1) "0",[2]=>string(1) "1"}
    $version =  "v".reset($versionArray); //v1
    
    $version = strtoupper($version);//小写变大写 V1
    
    if(!$header || count($versionArray)<3){
        return '版本丢失';
    }
    
    $serviceArray = explode("/",$service);//array(3) {[0]=>string(3) "App",[1]=>string(4) "Site",[2]=>string(5) "Index"}
    
    if(count($serviceArray) == 2){
        array_unshift($serviceArray,"App");
    }
    
    //判断公共方法,取消版本验证 (自定义)
    //if(in_array(reset($serviceArray),$this->noVersion())){
    //    return implode($serviceArray,".");
    //}
    
    //访问具体版本模块 (后期可优化为加密token)
    $namespace = count($serviceArray) == 2 ? 'App_V1' : reset($serviceArray)."_".$version;
    
    $apiName = $serviceArray[count($serviceArray)-2];
    
    $end = end($serviceArray);
    
    $actionVersion = $end;
    //小版本迭代时,需要访问的具体方法,(后期可优化为加密token)
    if(($versionArray[1]>0 || $versionArray[2]>0)){
        $functionVisit = $versionArray[1].".".$versionArray[2];
        //小版本向下兼容
        $versionCompatibility= $this->actionDownwardCompatibility($namespace,$apiName,$end,$functionVisit);
        if($versionCompatibility){
            $actionVersion = $versionCompatibility;
        }
    
    }
    
    $actionName = $actionVersion;
    
    
    return $namespace .".".$apiName.".".$actionName;// 最终路由:App_V1.User_Info.Index_0_1
    

    actionDownwardCompatibility 方法,查找文件中是否含有 类 及 方法

    
        /**
         * 版本向下兼容
         * @param $namespace string App_V1
         * @param $api string Lists_Courses
         * @param $action string Index
         * @param $versionNum string 1.1
         * @return bool
         */
        private function actionDownwardCompatibility($namespace,$api,$action,$versionNum){
            $namespace = str_replace("_",'\\',$namespace);
            $className  = '\\' . $namespace . '\\Api\\' . str_replace('_', '\\', ucfirst($api));
            $rClass = new \ReflectionClass($className);
            for ($i=floatval($versionNum);$i>=0.1;$i=$i-0.1){
                $version = str_replace(".",'_',number_format($i,1));
                $newAction = $action."_".$version;
                if($rClass->hasMethod($newAction)){
                    return $newAction;
                }
            }
            return false;
        }
    

    相关文章

      网友评论

          本文标题:Phalapi框架重写请求,实现小版本迭代

          本文链接:https://www.haomeiwen.com/subject/arutjctx.html