1

我正在尝试使用 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,即使我设置了路由 =“/tasks”。我应该能够通过 /tasks/1 访问它 为什么这不能按预期工作?(当我将它与 Zend_Controller_Router_Route_Regex 一起使用时,它工作得非常好)。

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

  • 任务控制器 (Zend_Rest_Controller)
  • 类型控制器 (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/ 访问

4

3 回答 3

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 参数的默认值设置为 null,因此如果未设置参数,路由仍会被触发。

于 2013-07-31T13:00:18.897 回答
0

似乎 Zend 需要将路由命名为“rest”,并且需要将模块(如属性)及其控制器作为值。例如:

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

这样,Tasks_TasksController 和 Tasks_TypesController 将成为 REST API。

仔细检查文档

于 2013-10-09T20:36:13.120 回答
0

这条线看起来很可疑:

routes.qtasks.tasks = "tasks"

你的意思:

routes.qtasks.action = "tasks"

或者:

routes.qtasks.defaults.tasks = "tasks"

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

于 2013-07-31T15:41:35.307 回答