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 などにアクセスできますが、タスク コントローラーにアクセスするには、route = "/tasks" を設定した場合でも、URL /tasks/tasks/1 を使用する必要があります。/tasks/1 からアクセスできるはずですが、期待どおりに動作しないのはなぜですか? (Zend_Controller_Router_Route_Regex で使用していたときは、まったく問題なく動作しました)。
更新: モジュールには 4 つのコントローラー (一部は REST、一部は通常) があります。私の REST コントローラー (Zend_Rest_Controller を拡張し、正しいメソッドに自動的にリダイレクトします) には、標準の REST メソッド (indexAction、getAction、putAction、postAction、deleteAction) があります。
- TasksController (Zend_Rest_Controller)
- タイプコントローラー (Zend_Rest_Controller)
- StatusController (Zend_Controller_Action) ですが、Rest Controller としてシミュレートされます (routes.ini を参照)
- ViewController (Zend_Controller_Action) => phtml に関連付けられたさまざまな php ビューを管理します
Zend は階層的な REST URL (この場合は /tasks/types/:type_id/status/:id) を管理していないように見えるため、StatusController は Zend_Action_Controller です。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 が機能します。http://demo.localhost/tasksではなくhttp: //demo.localhost/tasks/としてアクセスできるようにしたい TasksController に問題があるだけです。