【问题标题】:Deep routes in Zend Framework without modules - how?Zend Framework 中没有模块的深度路由 - 如何?
【发布时间】:2008-12-17 21:46:51
【问题描述】:

我正在为 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 是路由系统的全部目的。

【问题讨论】:

    标签: php zend-framework routing


    【解决方案1】:

    我不确定您是否同时定义了这两个。根据我的经验,您尝试映射的第一条路线实际上会被第二条处理得很好(感谢您为attribute 提供的默认值)。

    因此,这条路线:

    foo.com/resources/user/:id/:attribute
    

    有了这个电话:

    foo.com/resources/user/12345/
    

    假设你的默认属性值:

    foo.com/resources/user/12345//
    

    由于您的网络服务器可能会删除空白值(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"
    

    也可能对您的结果产生影响。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我认为你应该只改变规则的顺序......所以你首先把更具体的规则放在顶部,更一般的放在底部!

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

      我遇到了类似的问题,它解决了我的问题!

      【讨论】:

      • 其实这样不行。它抛出完全相同的异常。不过,感谢您的建议。
      • 更一般的规则应该放在第一位
      猜你喜欢
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多