版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
思路,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默认路由的原因。这里有两种解决方法
- 将基础控制器写在Application目录下的controller中
- requier控制器文件
我采用的是第二种方式,第一种方式不符合接口的迭代方式
require_once(dirname(__FILE__) . '/Api.php');
class Apiv2Controller extends ApiController{
}