我已经使用Regex成功创建了我的路线。我的路线中有几个可选参数,除非用户已指定,否则我不想在URL帮助器中显示这些参数。我该怎么做?
这是我目前所拥有的
$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))',
array(
'controller' => 'widget',
'action' => 'list',
),
array(
1 => 'color',
2 => 'page',
3 => 'limit'
),
'%s-Widgets/'
);
$router->addRoute('color_widgets', $route);
然后,我使用以下代码调用URL帮助器
echo $this->url(array('page' => $page), 'color_widgets', false);
这将导致/ Blue-Widgets /,并且不会将Page发送到URL。我可以通过更改路由器中的反向按钮来解决此问题
$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))',
array(
'controller' => 'widget',
'action' => 'list',
'page' => 1
),
array(
1 => 'color',
2 => 'page',
3 => 'limit'
),
'%s-Widgets/page/%d'
);
但这不能解决我的问题,说我有一个网址
/ Blue-Widgets / page / 1 / limit / 10没有显示限制,我可以使用以下方法修复该限制
$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))',
array(
'controller' => 'widget',
'action' => 'list',
'page' => 1,
'limit' => 10
),
array(
1 => 'color',
2 => 'page',
3 => 'limit'
),
'%s-Widgets/page/%d/limit/%d'
);
问题是用户在
/ Blue-Widgets /,我想使用以下代码将它们带到Blue Widgets的下一页
echo $this->url(array('page' => $page), 'color_widgets', false);
他们实际上被带到
/ Blue-Widgets / page / 2 / limit / 10
当我真的想带他们去
/ Blue-Widgets / page / 2
我如何使用Zend框架来完成此任务。
最佳答案
不能使用具有可变数量值的正则表达式反向路由。
你可以:
例如,您可以将路线更改为:
$route = new Zend_Controller_Router_Route(
'widgets/:color/*',
array(
'controller' => 'widget',
'action' => 'list',
'page' => 1,
'limit' => 10
),
array(
'color' => '[a-zA-Z-_0-9-]+',
'page' => '\d+',
'limit' => '\d+',
)
);
另一种选择是创建自己的自定义路由类,该类可以解析并构建正确的uri。