Zend FrameworkでClick風コンポーネント志向?

Click Frameworkの「コンポーネント、ページ指向」から、気に入ったエッセンスを頂戴することにする。
http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/click?page=WhyClick

下記の解説もわかりやすい
http://www.ogis-ri.co.jp/otc/hiroba/technical/ClickFramework/clickfw01.html

コンポーネント、ページ指向を参考にしてみる

  • MVCのジレンマからの脱出
    • システム全体をMVC分割せず、コンポーネントもしくはページクラスのそれぞれにMVCを集約する
    • コンポーネントによるコンパクトな開発とページ指向によるコンポーズ
      • 1ルーティング 1コントローラーを基本とせず、1ルーティング 1ページと考えページに必要な処理をコンポーネントから調達する。
  • 初期学習コストの低減
    • 用意した基本コンポーネントから素早く開発が可能に。
    • 作業単位を小さくすることで、ビューやファイル群との対照関係をわかりやすくし、記憶すべき内容を最小限に。
  • さまざまな参加者への利便性の提供
    • プロジェクト視点
      • サイトの開発プロセスや開発済みサイトの資産を流用できるケースが増え、個別対応には、コンポーネントの追加や拡張だけで済む可能性があるため、プロジェクトの展望が立てやすい
      • コンポーネントを個別にテストできるため、運用中のサイトへの機能追加や他の機能とバッティングするリスクを減らせる。
      • 大規模開発では、開発単位を分割してセル生産方式等の分業や機能単位での外注仕様が明確になる。
    • プログラマー中心の小規模開発
    • デザイナー中心のCMS的利用
      • デザイナーだけでサイトを構成したいときは、PHPTAL等をテンプレートエンジンとして作られたテンプレートを解釈することで、ページクラスやビュースクリプトをビルドする。コンポーネントとして提供されている機能で構成することになるが、使うときは、ルーティングに合わせた設定ファイルとルーティングから得られたパラメーターでページを構築していく。依存を減らせば合理的なキャッシュを構成するための具にもしやすい。

想定する表示フローの基本

  1. フロントコントローラー(ルーティング)
  2. ルーティング->ページクラスへの対応付け
  3. ページクラスの記述を元に必要なコンポーネントの初期化と準備、必要なアクションの実行
  4. ページクラスにビューを指示
    • レイアウト -> プレスホルダー -> ウィジェット という階層で表示が制御される
    • ウィジェットはZend_Form風のデコレーターを利用するので、ウィジェットでありながら、作成されるソースには自由度を確保する。

Zend Frameworkで実装するなら・・・

  • 可能性1)プラグインでページクラスを制御する
    • アクションコントローラーをコンポーネントと見立てる
    • ページクラスについては、新規作成
    • ページクラスをフロントコントローラーのpreDispatchで処理するプラグインで制御。(個人的には、ルーティングに対応するスキームだと思っているので、オレオレの中ではページスキームとでもいうかもしれない。)
    • ページクラスは下記のいずれかまたは複数を合わせて構成
      • メインになるクラスとビュースクリプト
      • テンプレートエンジンで解釈できるものを利用し、ビューと設計を含んだもの
      • 設定ファイル
    • アクションコントローラーをコンポーネントとして使うのは一つの手だが、コンポーネントとして独立して設計すべきかもしれない。そこは、しばし考える。
  • 可能性2)アクションコントローラーをページクラスとして利用する
    • ルーティングからアクションコントローラーへの流れはすでにあるのでそれを利用してページクラスを構成する。
    • アクションコントローラーのinitでリクエストを元に設定ファイルをページ処理の実設計を読み込む。
    • アクションコントローラーから独立してコンポーネントを呼びだすことになるので、コンポーネント群は別個に作成する必要がある。
    • コンポーネント(ウィジェットも)はZend_Formをプロトタイプに
      • おそらく、Zend_Formで内包しているMVCのうち、ビュー部分(デコレーター実装)をウィジェットとして切り離してコンポジットするような設計になる。
  • 可能性3)1と2のハイブリッド
    • アクションコントローラーはページクラスとして利用するが、インスタンス化する設定についてはプラグインで設定ファイルを読み込んでその設定を元にページクラスインスタンスを立てる。もしくは、アクションコントローラーのpreDispatchをフックして設定を注入する。

※要するにここで想定しているコンポーネントとはMVCコンテナーってこと。Zend_Formは既にMVCコンテナーではある。

yii Frameworkでできるか?

yiiについては、まだまだ調べがついていないのだが、コンポーネント指向なフレームワークなので、ZFで組むより親和性が高いかどうかが知りたいところ。