1

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

/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); 

但这条路线不会被“?”触发 url 中的符号

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

PS:不要提供使用 '/' 而不是 '?',问题正是关于 Zend_Controller_Router_Route_Regex 实现中的模式限制。

4

1 回答 1

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') 
于 2011-02-14T15:20:02.487 回答