アクションコントローラーの保存を多階層化
アクションコントローラーの保存を多階層化して、多数のコントローラーを整理できるようにした。
Zend_Controller_Dispatcher_Standardのコントローラー名解決でサブディレクトリ仕様にしてみた。
Zend_Controller_Dispatcher_Standardを継承したクラスを作って、
_formatName内で下記のように一行変更する。
<?php // $segments[$key] = str_replace(' ', '', ucwords($segment)); $segments[$key] = str_replace(' ', $this->getPathDelimiter(), ucwords($segment));
あとは、フロントコントローラーにsetDispatcherでnewして注入するだけ。
/foo-bar/baz/
へのリクエストを
controllers/foo/barController.php
で処理できるようになる。
ビューの保存場所についても区分できるようになった。
デメリット
継承する基底クラスをインクルードするのが面倒・・・
モジュール上でautoloaderを通すか。
動機
http://d.hatena.ne.jp/noopable/20090204/1233700976
この関係で、ページクラスなどコントローラーの分類に意味付けすることも同時に処理できそうだ。Dispatcherをちょいと調整して次に進むことにする。
検討した内容
- モジュール内にコントローラーを識別できるサブディレクトリを作り区分する
- 用途によってコントローラーに接頭辞を付けて管理する。
- 接頭辞に対応するディリレクトリにコントローラーを保存。
- 解決方法の変更
- 元仕様:foo-barコントローラーはFooBarControllerへマップ
- クラス名はModule_FooBarController
- 変更仕様: foo-barコントローラーはfoo/BarControllerへマップ
- クラス名はModule_Foo_BarControllerになる。
- 元仕様:foo-barコントローラーはFooBarControllerへマップ
- ルーティングの内部ルールとして、page接頭辞を持つコントローラーにするように運用。
- 外部から直接来てもらいたくないコントローラーについては、コントローラー側でAcl実装を行う。
- dispatcherのisDispatchableに機能追加する方が固いが、オプションの注入が面倒。