English 中文(简体)
Zend框架中没有模块的深层路由-如何实现?
原标题:
  • 时间:2008-12-17 21:46:51
  •  标签:

我正在为REST服务编写一些路由。我的一个资源的URI看起来像这样

资源/用户/:id

我也想给用户的各项属性提供访问权限,具体形式如下:

资源/用户/:id/:attribute

但是当我试图定义后面的路径时,它没有起作用。这是我的INI文件,其中定义了路由。

routes.user.route = "资源/用户/: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 = "资源/用户/: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"

当我试图在浏览器中访问资源/用户/ 4 /评论时,我会得到以下输出

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是路由系统的整个目的。

问题回答

我不确定您是否同时定义了这两个。根据我的经验,您正在尝试绘制的第一条路线实际上可以通过第二条路线很好地处理(由于您为< code>属性提供的默认值)。

因此,这条路线:

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"

可能会对您的结果产生影响。希望这能帮到您。

我认为你应该只改变规则的顺序...这样你可以先将更具体的规则放在顶部,更普遍的规则放在底部!

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+"

我有一个类似的问题,然后解决了我的问题!





相关问题
热门标签