我正在尝试使用Zend_Rest_Route构建API。 在我的任务模块中,我有3个控制器:
我可以通过在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)
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/
答案 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。