Zend_Controller_Router_Route_Regex允许'?'在模式中

时间:2011-02-14 14:43:00

标签: zend-framework zend-route

想象一下情况,当网址看起来像

/catalog/sectionIdent?page=1

其中页面参数是可选的。

当然,应该定义自定义路线。请考虑以下代码:

    $route = new Zend_Controller_Router_Route_Regex(
        'catalog/([-a-z]+)(?:\?page=([0-9]*))?',
        array('controller'=>'catalog','action'=>'list','page'=>''),
        array(1=>'section',2=>'page'),
        'catalog/%s?page=%d'
    );
    $router->addRoute('catalog-section-page',$route); 

但是这条路线不会被'?'触发网址中的符号

没有'?' (例如,通过向模式添加转义'!'符号)一切正常。 有没有办法实现'?'存在于自定义的正则表达式路由?也许我在模式中做错了什么?

P.S。:不提供使用'/'代替'?',问题正是关于Zend_Controller_Router_Route_Regex实现中的模式限制。

1 个答案:

答案 0 :(得分:2)

ZF路由类在REQUEST_URI上运行,查询字符串被剥离,因此您可能很难按照预期的方式工作。但是,我相信GET参数默认放入请求对象中,因此您不需要在路由中满足它们的要求。我建议您更改路由以删除查询字符串部分:

$route = new Zend_Controller_Router_Route_Regex(
    'catalog/([-a-z]+)',
    array('controller'=>'catalog','action'=>'list'),
    array(1=>'section'),
    'catalog/%s'
);
$router->addRoute('catalog-section-page',$route); 

您仍然可以访问控制器中的参数,就像它们已被路径填充一样:

public function listAction()
{
    echo $this->_getParam('page');
}

您可以使用相同的方法设置默认值:

public function listAction()
{
    $page = $this->_getParam('page', 1); // defaults to 1 if no page in URL
}

你可能需要在那里对它们进行消毒(确保它们是数字的)。

修改

此路由的URL帮助程序示例:

echo $this->url(array('section' => 'foo', 'page' => 2), 'catalog-section-page')