ActionStackで作るZF流ウィジェット

Zend Frameworkのドキュメントにもウィジェット実装に関するアドバイスが入っている。

http://framework.zend.com/manual/ja/zend.layout.quickstart.html#zend.layout.quickstart.mvc
この節の下の方に

この機能は、ActionStack アクションヘルパー や プラグイン と組み合わせて使うと非常に便利です。 アクションのスタックを作成してそれをループさせ、 ウィジェット形式のページを作成するというわけです。

という具合に書いてある。
Zend_Layoutもしくはプレースホルダを使うことで、そこにウィジェットを集約していくわけだ。
具体的なコードと解説は下記にある。
http://framework.zend.com/manual/ja/performance.view.html#performance.view.action.actionstack
ディスパッチループに入る前に、処理を追加したい仮想リクエストを作成してアクションスタックにpushしている。
この例では専用のクラスで直接投入しているわけだが、投入部分を抽象化すれば、設定ファイルから任意のアクションを、投入したいレスポンスセグメントにスタックするという汎用化はすぐにできる。

アクションスタックに関する説明はここにある。
http://framework.zend.com/manual/ja/zend.controller.actionhelpers.html#zend.controller.actionhelpers.actionstack
アクションスタックを利用する設計上のメリットは、実行されるタイミングにあるような気がする。基本的なコントローラーの処理後でありながら、Zend_Layoutより前にrenderされるし、プラグインを明示的に指定しなくても利用できるところも便利。ビュースクリプトから直接アクションヘルパーを呼ぶこともできるが、postDispatchで通常のアクションと同等に処理されるアクションスタックの方が初期化コストやプラグイン等が正確に動作するので合理的と言われればその通りだろう。
同様に、自前でコンポーネント指向の実装をねじ込むよりも、用意された機構を使う方がなにかと便利な局面を期待できる。

ウィジェット風の実装はこれでできるのだが、自分のやりたいことと微妙に違うのは、単純にループしてコンテンツを集約するのがウィジェットの目的じゃないってことの実現なんだと思う。ウィジェットウィジェットをコンポジットして評価をぎりぎりまで遅らせて統合管理できるような仕様にしたいと妄想している。
そのためには、アクションスタックとは微妙に違う実装、もしくは追加の工夫を入れていく必要があるように思うが、それはまたいずれ。

関連:
http://d.hatena.ne.jp/noopable/20090128/1233120769