想象一下情况,当网址看起来像
时其中页面参数是可选的。
当然,应该定义自定义路线。请考虑以下代码:
$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实现中的模式限制。
答案 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')