Zend Regex路由器与任何东西都不匹配

时间:2013-09-17 20:40:02

标签: php regex zend-framework routing

我目前有一个Zend Framework路由定义如下:

$route = new Zend_Controller_Router_Route('brand/:brand_name/series/:page',
                                                array('controller' => 'brand',
                                                    'action' => 'series',
                                                    'page'=>'1'));
$router->addRoute('Brand Series', $route);

我正在尝试调整此路由,以便页面参数仅捕获数字,这样我就可以添加另一条路径,在同一个地方使用单词而不会发生两个冲突,例如:

brand/:brand_name/series/:series_name/:page

我想我会继续阅读ZF文档here中的示例。第一步是将路线改为:

$route = new Zend_Controller_Router_Route_Regex('brand/:brand_name/series/(\d+)',
                                                array('controller' => 'brand',
                                                    'action' => 'series'));

然而,这个小小的改变导致之前完全匹配的路线,如/brand/johnnycupcakes/series/2失败,告诉我Action "johnnycupcakes" does not exist and was not trapped in __call()。在堆栈跟踪中,我看到:

'controller' => 'brand',
'action' => 'johnnycupcakes',
'series' => '2',
'module' => 'default'

实际上,即使我将路由和默认参数与第一个示例完全相同,只需将类更改为Router_Route_Regex,我也会得到相同的错误。

我知道错误不是路由冲突,因为我没有添加会发生冲突的路由。此外,它似乎正在尝试匹配标准路线。我在版本1.11上测试它,所以我的版本应该与示例中的代码完全兼容。

据我所知,正则表达式路线根本不匹配,尽管它非常明显。为什么这可能会失败?

编辑: 我第一次从问题中省略了addRoute。我总是在代码中使用它,这不是问题。

1 个答案:

答案 0 :(得分:0)

您需要的是通过向Zend_Controller_Router_Route_Regex添加第三个参数来命名捕获的数字参数:

$route = new Zend_Controller_Router_Route_Regex(
    'brand/:brand_name/series/(\d+)',
    array(
        'controller' => 'brand',
        'action' => 'series'
    ),
    array(
        1 => 'series', // name the parameter captured by (\d+)
    )
);

第二个数组可能具有相反关系'series' => 1的键和值,它仍然有效。在regex routes

上查看ZF手册中的更多内容