我正在使用zend构建一个Web服务,我正在使用模块来分离我的api版本。例如:“applications / modules / v1 / controllers”,“applications / modules / v2 / controllers”具有不同的操作和功能。
我已将“v1”作为“application.ini”文件中的默认模块:
resources.modules = ""
resources.frontController.defaultModule = "v1"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.moduleControllerDirectoryName = "controllers"
我在自举文件中写了以下内容:
$router = $front->getRouter();
$r1 = new Zend_Controller_Router_Route_Regex('api/v1/tags.xml',
array('module' => 'v1', 'controller' => 'tags', 'action' => 'index'));
$router->addRoute('route1', $r1);
假设,如果这是我的网址:http://localhost/api/v1/tags.xml
然后它属于版本1(v1)。
但我不想写很多这样的路线,所以我想知道如何从正则表达式网址跟踪版本并动态确定要使用的api版本(1或2)。
答案 0 :(得分:1)
试试这个:
$r1 = new Zend_Controller_Router_Route_Regex('api/(v.*)/tags.xml',
array('module' => 'v1', 'controller' => 'tags', 'action' => 'index'),
array(1 => 'module')
);
这将自动覆盖模块参数,并因此自动路由到正确的模块。无需再使用preDispatch
方法的插件。
答案 1 :(得分:1)
尝试使用
$r1->addRoute(
'json_request',
new Zend_Controller_Router_Route_Regex(
'([^-]*)/([^-]*)/([^-]*)\.xml',
array(
'controller' => 'index',
'action' => 'index',
'request_type' => 'xml'),
array(
1 => 'module',
2 => 'controller',
3 => 'action'
)
));
答案 2 :(得分:0)
到目前为止,我试过这样:
$r1 = new Zend_Controller_Router_Route_Regex('api/v(.*)/tags.xml',
array('module' => 'v1', 'controller' => 'tags', 'action' => 'index'),
array(1 => 'version')
);
$router->addRoute('route1', $r1);
我可以从here获得一个想法:
所以现在我使用了前置控制器,在preDispatch方法中,我根据“版本”参数值中的值设置模块名称,如
if($request->getParam('version') == 2 { $request->setModuleName('v2') }
但是在将url中的版本更改为v2之后,它仍然会转到v1模块中控制器的操作。