重写Yaf路由,实现不同版本App调用不同接口

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_31343581/article/details/81946913

思路,app {version}版本,调用 /baseuri/module/version/controller/action

其中:
baseuri是网页的前缀
version是版本号

接下来我们将会用到yaf的路由重写,我用的是Yaf_Route_Regex,正则匹配,比较灵活。
重写Bootstrap来注册你的路由,代码如下:
 public function _initRoute(Yaf_Dispatcher $dispatcher) 
 {
     // 根据版本路由
     $base_url = $dispatcher->getRequest()->getBaseUri();
     $url = $dispatcher->getRequest()->getRequestUri();
     $request_uri = str_replace($base_url, '', $url);
     // 首先自己匹配出来version和controller
     preg_match('/module\/([^\/]+)\/([^\/]+)\/([^\/\?\#]+)/i', $request_uri, $match);
     $version = $match[1] ?? '';
     $controller = $match[2] ?? '';
     if ($version && $controller)
     {
       $route = new Yaf_Route_Regex(
          "/module\/([^\/]+)\/([^\/]+)\/([^\/\?\#]+)/i",
          array(
             'module' => "module",
             // 例如 Foo/v2/Api/index 重写为 Foo/Apiv2/index
             'controller' => strtolower($controller . $version),  
             'action' => ":action",
          ),
          array(
             1 => "version",
             2 => "controller", 
             3 => "action", 
          )
       );
       $dispatcher->getRouter()->addRoute('v2', $route);
       // 打印出module、controller、action查看是否对应
        // var_dump($dispatcher->getRequest()->getModuleName());
        // var_dump($dispatcher->getRequest()->getControllerName());
        // var_dump($dispatcher->getRequest()->getActionName());
        // die;
     }
 }
打开注释可以看到路由成功,那么接下来的第二个问题,让Apiv2继承Api.
在yaf中,如下写法是无法继承当前Controller目录下的其他控制器的。
class Apiv2Controller extends ApiController {}
是因为yaf默认路由的原因。这里有两种解决方法
  1. 将基础控制器写在Application目录下的controller中
  2. requier控制器文件
我采用的是第二种方式,第一种方式不符合接口的迭代方式
require_once(dirname(__FILE__) . '/Api.php');
class Apiv2Controller extends ApiController{

}
重新访问 /baseuri/module/v2/Api/index,得到与 /baseuri/module/Api/index相同的结果,改造成功!
如果你要改造url为 /baseuri/v2/module/Api/index的方式也是同样的道理。

猜你喜欢

转载自blog.csdn.net/qq_31343581/article/details/81946913
今日推荐