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

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

Phalapi框架重写请求,实现小版本迭代_第1张图片
请求目录结构

composer配置
Phalapi框架重写请求,实现小版本迭代_第2张图片
composer配置

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

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

Phalapi框架重写请求,实现小版本迭代_第3张图片
初版和二版

以下为具体代码实现;

// 优先返回自定义格式的接口服务名称

$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框架重写请求,实现小版本迭代)