我使用正则表达式成功创建了我的路线。我的路由中有几个可选参数,我不希望在URL Helper中显示,除非用户指定了它们。我怎么能做到这一点?
这就是我目前所拥有的
$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 Helper
echo $this->url(array('page' => $page), 'color_widgets', false);
这会导致/ Blue-Widgets /并且不会将页面发送到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);
他们实际上被带到了 /蓝小部件/页/ 2 /限制/ 10
当我真的想带他们去 /蓝小部件/页/ 2
如何使用Zend Framework实现这一目标。
答案 0 :(得分:2)
不可能使用具有可变数值的正则表达式反向路由。 你可以:
您可以将路线更改为:
$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。
答案 1 :(得分:0)
你给出了错误的Regex匹配变量索引,这就是你得到奇怪结果的原因。您的代码应如下所示:
$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',
3 => 'page',
5 => 'limit'
),
'%s-Widgets/'
);
$router->addRoute('color_widgets', $route);