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

本文介绍如何在Yaf框架中使用路由重写,并通过正则表达式匹配实现不同版本控制器之间的继承。提供了具体的代码实例,展示如何配置路由以及解决控制器继承的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路,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的方式也是同样的道理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值