Phalapi框架重写请求,实现小版本迭代
2019-08-08 本文已影响0人
Ayo金彩
例:/?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;
}