我正在为REST服务编写一些路由。我的资源URI之一就像这样
资源/用户/:ID
我还想要访问用户的各个属性,看起来像这样
资源/用户/:ID /:属性
但是当我尝试定义后一种路线时,它不起作用。这是我定义路线的ini
routes.user.route = "resources/user/:id"
routes.user.defaults.controller = user
routes.user.defaults.action = get
routes.user.defaults.id = 0
routes.user.reqs.id = "\d+"
routes.user_attribute.route = "resources/user/:id/:attribute/"
routes.user_attribute.defaults.controller = user
routes.user_attribute.defaults.action = getAttribute
routes.user_attribute.defaults.id = 0
routes.user_attribute.defaults.attribute = ""
routes.user_attribute.reqs.id = "\d+"
routes.user_attribute.reqs.id = "reviews|lists"
当我尝试在浏览器中访问resources / user / 4 / reviews时,我得到以下输出
An error occurred
Page not found
Exception information:
Message: Invalid controller specified (resources)
Stack trace:
#0 /usr/local/lib/ZendFramework/ZendFramework-1.7.1-minimal/library/Zend/Controller/Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 /home/baileyp/public_html/web/index.php(50): Zend_Controller_Front->dispatch()
#2 {main}
Request Parameters:
array(4) {
["controller"]=>
string(9) "resources"
["action"]=>
string(4) "user"
[10]=>
string(7) "reviews"
["module"]=>
string(7) "default"
}
所以,它显然没有正确处理我的第二条路线,因为它控制器是“资源”而动作是“用户”。我在这做错了什么? Zend网站上没有关于我发现如何实现这一点的例子。
我不想仅仅为了完成这项工作而使用模块 - 避免创建文件夹,只需匹配URI就是路由系统的全部目的。
答案 0 :(得分:1)
我认为你应该只改变规则的顺序......所以你首先在顶部放置更具体的规则,在底部更一般!
routes.user_attribute.route = "resources/user/:id/:attribute/"
routes.user_attribute.defaults.controller = user
routes.user_attribute.defaults.action = getAttribute
routes.user_attribute.defaults.id = 0
routes.user_attribute.defaults.attribute = ""
routes.user_attribute.reqs.id = "\d+"
routes.user_attribute.reqs.id = "reviews|lists"
routes.user.route = "resources/user/:id"
routes.user.defaults.controller = user
routes.user.defaults.action = get
routes.user.defaults.id = 0
routes.user.reqs.id = "\d+"
我有类似的问题,它解决了我的问题!
答案 1 :(得分:1)
我不确定你是否将这两个并排定义。根据我的经验,您尝试映射的第一条路线实际上会在第二条路线上处理得很好(感谢您为attribute
提供的默认值)。
因此,这条路线:
foo.com/resources/user/:id/:attribute
通过此电话:
foo.com/resources/user/12345/
假设您的默认属性值为:
foo.com/resources/user/12345//
由于您的Web服务器可能会删除空白值(apache将多个斜杠视为单个斜杠),我建议将该属性默认为可以通过名称调用的内容,它的功能类似于index.html文件夹中的文件:
foo.com/resources/user/12345/
foo.com/resources/user/12345/general/ (same result)
我遇到的最好的运气是按顺序逐行注释路径默认值和要求。你最终会看到路线本身的“边缘”(因为当你给它较少的信息时,它会回落到默认值)。
此外,在您的示例中,请注意您要定义两次id
要求:
routes.user_attribute.reqs.id = "\d+"
routes.user_attribute.reqs.id = "reviews|lists"
将调整为:
routes.user_attribute.reqs.id = "\d+"
routes.user_attribute.reqs.attribute = "reviews|lists"
也可能对您的结果产生影响。希望这会有所帮助。