我有这些需要工作的路线:
/user
/user/1
/user/1.json
目前我有
'user' => array('key' => 'user', 'controller' => 'user'),
'user/:id' => array('key' => 'user-id', 'controller' => 'user', 'id' => "\d+"),
'user/:id.json' => array('key' => 'user-id-json', 'controller' => 'user', 'id' => "\d+"),
它匹配所有三个网址的第一条路线。
我试过这样做:
'user' => array('key' => 'user', 'controller' => 'user'),
'user/"\d+"' => array('key' => 'user-id', 'controller' => 'user', 'id' => 1),
'user/"\d+".json' => array('key' => 'user-id-json', 'controller' => 'user', 'id' => 1),
但只有第一条路线仍匹配
在Zend Route网址规则中是否有一种方法可以“封装”:id以便将其选中并允许我放置/之后的其他内容?
我的引导程序使用:
public function _initRoutes() {
$this->addRoutes(array(
'client' => array('key' => 'client', 'controller' => 'client'),
'client/:id' => array('key' => 'client-id', 'controller' => 'client', 'id' => "\d+"),
'user' => array('key' => 'user', 'controller' => 'user'),
'user/:id' => array('key' => 'user-id', 'controller' => 'user', 'id' => "\d+")
));
}
我的扩展扩展程序使用
public function addRoutes($routes) {
$router = Zend_Controller_Front::getInstance()->getRouter();
foreach ($routes as $pattern => $data) {
$router->addRoute(
$data['key'],
new Zend_Controller_Router_Route(
$pattern,
array('controller' => $data['controller'])
)
);
}
}
我尝试过制作addRoutes:
public function addRoutes($routes) {
$router = Zend_Controller_Front::getInstance()->getRouter();
foreach ($routes as $pattern => $data) {
$router->addRoute(
$data['key'],
new Zend_Controller_Router_Route(
$pattern,
array('controller' => $data['controller'])
)
);
$router->addRoute(
$data['key'].'-json',
new Zend_Controller_Router_Route(
$pattern.'.json',
array('controller' => $data['controller'])
)
);
}
}
但后者取消了/ user / 50例如
答案 0 :(得分:0)
首先,不要试图在一条路线上完成这一切;你可以有多个命名路线指向同一个地方。如果你试图为一条路线定义这个,那么从大块中就不清楚了。如果是,请将规则拆分为三个,并为它们提供相同的变量。
如果您的路由是在ini文件中定义的(按惯例,路由.ini),那么我发现更容易使用/ user /:id /:format。然后,您可以在控制器中使用Zend contextSwitcher帮助程序,或者只使用:format作为应用程序的提示。在你的路线的reqs部分,你应该有(\ d +)Zend_Route寻找子字符串。
如果做不到这一点,你可以逃脱:id:file并将.json定义为该特定路线的req。如果您必须具有文件扩展名,则可能会有效。但是,由于您通过将PHP脚本作为json提供服务来欺骗用户,因此可以在Web服务器级别更好地处理。如果所有其他方法都失败了,并且您的正则表达式foo取决于它,则创建一个Regex路由器的实例。虽然这是未经测试的,但这可能会这样做:
/user/(\d+)\.json$