Zend Framework 1.12.3 を使用して API を開発しています。Zend_Rest_Route を使用していますが、階層 URL が必要です。
- http://api.example.com/professors
- http://api.example.com/professors/:professorId
- http://api.example.com/professors/:professorId/subjects
- http://api.example.com/professors/:professorId/subjects/:subjectId
特定の科目を特定の教授に割り当てる必要があるため、このアプローチの使用を検討していますが、このスキーマがそれをうまく解決すると信じています。
しかし、階層 URL を実現するのに苦労しています。私はすでに試しました:
Zend_Controller_Router_Route はチェーン付きで、config .ini ファイルにありますが、コントローラーとアクションの両方を指定する必要があるため、http://api.example.com/professors/:professorId/subjectsにアクセスすると、常に同じアクションを指していました (つまり、呼び出し方法が何であれ (POST、PUT、GET、DELETE)、config .ini ファイルで指定されたアクションを常に指していました)。たとえば、構成ファイルで getAction を指定した場合、チェーンを使用すると、使用したメソッドに関係なく、常に getAction が呼び出されます。現在、POST 呼び出しを行うと、実際には postAction() が呼び出されます (同様に、PUT、GET、DELETE、PATCH、HEAD、および OPTIONS についても発生します)。私のコントローラーファイルは次のようになります。
class V1_ProfessorsController extends REST_Controller { public function optionsAction() { // code goes here } public function headAction() { // code goes here } public function indexAction() { // code goes here - list of resources } public function getAction() { // code goes here } public function postAction() { // code goes here } public function putAction() { // code goes here } public function patchAction() { // code goes here } public function deleteAction() { // code goes here } }
Zend_Rest_Route をサブクラス化し、ここで指摘されているように match() 関数をオーバーライドします。問題は、これは を呼び出すときに機能しますが、 を呼び出す
http://api.example.com/professors/:professorId/subjects
ときに使用されるものと同じ ProfessorsController を引き続き使用するということhttp://api.example.com/professors
です。これについてはよくわかりませんが、独自のコントローラー (ProfessorsSubjectsController など) を用意するのが最善だと思います。
また、質問があります。階層ルートはどのように機能する必要がありますか? リソース/サブリソースごとに異なるコントローラーを用意したほうがよいでしょうか? たとえば、ProfessorsControllerhttp://api.example.com/professors/:professorId
と ProfessorsSubjectsControllerを持っていhttp://api.example.com/professors/:professorId/subjects/:subjectId
ますか?