表層系と処理系でコントローラーを区別する方策
「表層系のページ構成部分と、オブジェクトモデルの処理系を区分したい。」
http://d.hatena.ne.jp/noopable/20090201/1233445916
これを実現したいとする。
コントローラーを識別するのにどういう方法がいいのかを検討してみた。
- モジュラーディレクトリ構造を分割する
- モジュールディレクトリ内で構造を分割する
- コントローラーはページクラス専用とし、サービス関係はアクションヘルパーで実装する
- ページクラスは専用のプラグインから呼びだすようにする。
- ディスパッチャーを細工する
- 構造をそのままにして、特定のモジュールをページクラス専用にする。モジュラーでの分割はしない。コントローラーは別モジュールと対照になるようにする。
ディレクトリ構造ごと分割すれば、コードの物理的な管理はしやすい。しかし、ページクラスの管理が個々のモジュールと離れるとモジュールの独立性が失われ、可搬性が落ちる。ページクラスはモジュールから提供される可能性がある一方で、複数のモジュールをまたいで仕事をする可能性もある。
しかしコンポーネント内部からウィジェットを呼び出す場合を想定すると、ディスパッチャでのクラス名解決を変えた方が都合がよいかもしれない。構造はそのまま、特定のモジュールをページクラスとして利用すれば内部処理は簡単ではある。
モジュラーディレクトリ構造で解決してみる
Zend Frameworkでは、コントローラー・モデル・ビューのディレクトリ構造を合わせてモジュールを構成する。そのモジュールの集まりをモジュラーディレクトリとして扱っている。ページクラスとして利用するモジュール群と、サービスとして利用するコントローラーの親ディレクトリを分割する。モデルは処理系にだけあればよいが、表層系でも2次的なモデルを作成してキャッシュベースのページ処理を可能にする。
- pages モジュラーディレクトリ(サイトの表層的な区分、ルーティングの対象になる)
- www
- contorllers (ページをコントロールする)
- models (キャッシュやクエリオブジェクトなどで利用する)
- views (PHPTALなどで記述)
- admin
- contorllers
- models
- views
- rest
- contorllers
- models
- views
- www
- services モジュラーディレクトリ (機能と処理による分類、ルーティングされない)
- news
- controllers
- widgets
- models
- views
- forum
- controllers
- widgets
- models
- views
- news
ディスパッチャで解決してみる
ディスパッチャでコントローラー名やコントローラークラスの検索パスを特定している。この部分を制御できるようにすれば、柔軟性が少し上がる。
システム構造を手動で変更しなくても、レシピベースで組み方を変えていく拡張性を考えれば、汎用的なディスパッチャ仕様に変更してモジュール内で容易に解決できるようにしておくのも一つの考え方となる。
モジュール内で分割 (クラス名解決は変更せず、コントローラーディレクトリ解決を工夫する)
関連
http://d.hatena.ne.jp/noopable/20090130/1233268607
"Click Framework"風にページクラスを作成しつつ、次にコンポーネントを呼び出すという構成にしようとすると、アクションコントローラー群をページクラスとして利用するか、コンポーネントとして利用するか、その選択に迷うが、この方式にすれば
また、
http://d.hatena.ne.jp/noopable/20090131/1233356124
アクションスタックを利用してウィジェット風に扱う場合も、なんでもかんでもウィジェットとして呼ばれては困るし、また、ウィジェットをリクエストされても困る。