Zend Regex Route>跟踪api版本

时间:2011-03-02 12:55:04

标签: php zend-framework

我正在使用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)。

3 个答案:

答案 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模块中控制器的操作。