Easyswoole 提供了高自由度的版本控制插件,版本控制的代码实现在Core\Component\Version中
;
你可以在/Conf/Event
中的frameInitialize
方法实例化自己的Control类,并为其添加版本和路径映射以及默认操作闭包,注入容器之后,在/Conf/Event
中的onRequest
方法中调用Di::getInstance()->get("version")->startControl()
;来实现某些特定接口的版本控制拦截,没有对应的映射的话,先找到version
默认的defaulthandler
,如果既不是路径字符串,也不是闭包,再找 control 实例的defaulthandler
,也没有设置默认的再找 control 实例的defaulthandler
,最后走dispatch
直接解析 url 。
具体使用示例
- 你可以使用 get 参数的形式进行版本控制
$versionControl = new Control();
$versionControl->addVersion("v1",function (Request $request){
if($request->getRequestParam("version") == 1){
return true;
}
})->addPathMap("/test",function (Request $request,Response $response){
$response->writeJson(200,"v1");
})->addPathMap("/test111", "/test");
上面的示例代码:
/test?version=1 被映射到闭包
/test111?version=1 被映射成
- 使用伪静态参数的形式进行版本控制
$versionControl->addVersion("v2", function (Request $request, Response $response){
$path = UrlParser::pathInfo();
if ($index = strpos($path, '/v2') === 0){
$newPath = substr($path, $index+strlen('/v2')-1);
Request::getInstance()->getUri()->withPath($newPath);
return true;
}
})->addPathMap("/test", function (Request $request, Response $response){
$response->write("v2test success");
})->addPathMap("/test111", "/test2");
上面的示例代码:
/v2/test 被映射到闭包
/v2/test111 被映射成/test2
- 使用头部参数的形式进行版本控制
$versionControl->addVersion("v3", function (Request $request, Response $response){
$version = $request->getHeader('version');
if (!isset($version[0])){
return false;
}else {
$version = $version[0];
if ($version == 3){
return true;
}
}
})->addPathMap("/test", function (Request $request, Response $response){
$response->write("v3test success");
})->addPathMap("/test111", "/test3");
总结
通过以上实例代码可以发现,easyswoole的版本控制完全可以根据自己的需求自己定制,把条件写入addVersion的闭包中,然后符合条件就return true就可以根据自己的需求定制版本控制方式