在routes.ini中使用Zend_Rest_Route设置路由

时间:2013-07-31 11:44:10

标签: zend-framework zend-rest-route

我正在尝试使用Zend_Rest_Route构建API。 在我的任务模块中,我有3个控制器:

  • tasksController
  • typesController
  • statusController

我可以通过在routes.init中设置它来访问我的任务控制器

routes.qtasks.type = "Zend_Rest_Route"
routes.qtasks.route = "/tasks/:id"
routes.qtasks.defaults.module = "tasks"
routes.qtasks.defaults.controller = "tasks"
routes.qtasks.tasks = "tasks"

routes.tasktypes.type = "Zend_Rest_Route"
routes.tasktypes.route = "tasks/types/:id"
routes.tasks.defaults.module = "tasks"
routes.tasktypes.defaults.controller = "types"
routes.tasktypes.tasks = "types"

但是,我可以访问我的任务/类型,任务/类型/ 1等,但访问我的任务控制器,我必须使用url / tasks / tasks / 1,即使我已设置route =“/ tasks ”。我希望能够通过/ tasks / 1访问它 为什么这不能按预期工作? (当我以前和Zend_Controller_Router_Route_Regex一起使用时,它完全正常。)

更新: 我的模块中有4个控制器(一些REST,一些正常) 我的REST控制器(扩展Zend_Rest_Controller使其自动重定向到正确的方法)具有标准REST方法(indexAction,getAction,putAction,postAction,deleteAction)

  • TasksController(Zend_Rest_Controller)
  • TypesController(Zend_Rest_Controller)
  • StatusController(Zend_Controller_Action),但模拟为Rest Controller(请参阅routes.ini)
  • ViewController(Zend_Controller_Action)=>管理与phtml相关的不同php视图

StatusController是Zend_Action_Controller,因为Zend似乎不管理分层REST URL(在本例中为/ tasks / types /:type_id / status /:id)。我使用checkhttprequest方法转发到正确的操作。

这是我所有控制器的routes.ini:

; task views
routes.tasksindex.type = "Zend_Controller_Router_Route_Regex"
routes.tasksindex.route = "tasks/view"
routes.tasksindex.defaults.controller = "view"
routes.tasksindex.defaults.module = "tasks"
routes.tasksindex.defaults.action = "index"

routes.tasksviews.type = "Zend_Controller_Router_Route_Regex"
routes.tasksviews.route = "tasks/view/(\d+)"
routes.tasksviews.defaults.controller = "view"
routes.tasksviews.defaults.module = "tasks"
routes.tasksviews.defaults.action = "view"
routes.tasksviews.map.1 = "id"

routes.tasksadmin.type = "Zend_Controller_Router_Route_Regex"
routes.tasksadmin.route = "tasks/admin"
routes.tasksadmin.defaults.controller = "view"
routes.tasksadmin.defaults.module = "tasks"
routes.tasksadmin.defaults.action = "admin"

; tasks REST API
routes.tasks.type = "Zend_Rest_Route"
routes.tasks.route = "tasks/:id"
routes.tasks.defaults.module = "tasks"
routes.tasks.defaults.controller = "tasks"
routes.tasks.tasks = "tasks"

; task types REST API
routes.tasktypes.type = "Zend_Rest_Route"
routes.tasktypes.route = "tasks/types/:id"
routes.tasktypes.defaults.module = "tasks"
routes.tasktypes.defaults.controller = "types"
routes.tasktypes.tasks = "types"

; task type status Simulated REST API
routes.taskstypestatus.type = "Zend_Controller_Router_Route_Regex"
routes.taskstypestatus.route = "tasks/types/(\d+)/status/?([0-9]+)?"
routes.taskstypestatus.defaults.controller = "status"
routes.taskstypestatus.defaults.module = "tasks"
routes.taskstypestatus.defaults.action = "checkhttprequest"
routes.taskstypestatus.map.1 = "type_id"
routes.taskstypestatus.map.2 = "id"

注意:/ TypesController.php和StatusController.php工作。我只对TasksController有疑问,我希望http://demo.localhost/tasks而不是http://demo.localhost/tasks/tasks/

3 个答案:

答案 0 :(得分:0)

是否可以用以下内容替换两个路径块:

routes.tasks.type = "Zend_Rest_Route"
routes.tasks.route = "/tasks/:controller/:id"
routes.tasks.defaults.controller = tasks
routes.tasks.defaults.module = tasks
routes.tasks.defaults.id =

您将/:id param的默认值设置为null,因此如果未设置param,则仍会触发路由。

答案 1 :(得分:0)

这一行看起来很可疑:

routes.qtasks.tasks = "tasks"

你的意思是:

routes.qtasks.action = "tasks"

或:

routes.qtasks.defaults.tasks = "tasks"

您可能还需要设置id参数的默认值。

答案 2 :(得分:0)

似乎Zend要求将路由命名为“rest”,将类似属性的模块及其控制器命名为值。例如:

routes.rest.type = Zend_Rest_Route
routes.rest.tasks = tasks,types

这样,Tasks_TasksController和Tasks_TypesController将是REST API。

仔细检查documentation