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就可以根据自己的需求定制版本控制方式

results matching ""

    No results matching ""