ヱビスブログ ::Agavi feat. S2Container.PHP5
AgaviとS2Container.PHP5を組み合わせます。
これ自体はSymfony feat. S2Container.PHP5や、 kloveさんのMojaTea - Mojavi3とTeaContainerでDI+AOP と同じ体でやれることなんでちょっと味付け。 ソースコードの説明をしてるととんでもない事になるのでサンプルとしてまとめました。
それを解説する方向で行きます。
[UPDATE 2006/May/09] [CHG]サンプルのCDActionにContainerのインスタンスを取得する場合のメソッドを追記(コメントアウト) [CHG]S2AgaviControllerでActionがインターフェースの場合のみ特殊ExecutionFilterに移行するように修正 ■はじめに改造版AutoloadConfigHandler.class.phpの使用を前提に進めます。サンプル1はベーシックな連携を行います。 サンプル2ではかなりトリッキーな事をします。まだまだ試行錯誤中。 MapleとかEthnaでは余裕で出来ることかもわかりません。Agaviという枠で考えるとトリッキー。 S2Containerの呼び出しですが、 getActionをフックにするのはSymfonyと変わりません。 FrontWebControllerを拡張したものをS2AgaviController.class.phpとして使います。 S2Dao.PHP5はコメントアノテーションを使わないやり方で行きます。 ■環境Debian/Sarge(coLinux)Apache-2.2.0 PHP-5.1.1 MySQL-4.1.11 Agavi0.11.0-DEV(SVN) S2Container.PHP5-1.1.0(PEARインストール) S2Dao.PHP5-1.1.0-RC2(PEARインストール) [Agavi/S2Container.PHP5/S2Dao.PHP5]Agaviは0.11.0-DEV(SVN版)を使用します。PEARインストールしたものを上書きしてますが、PATHが通っていればどこに配置しても問題ないと思います。 S2Container.PHP5/S2Dao.PHP5はPEARコマンドでインストールしています。 [agavi.php]S2Container.PHP5/S2Dao.PHP5のクラスを呼び出せるようにautoload節を修正します。[S2AgaviController.class.php]Symfonyでやったのと同じ体なので割愛。Agaviのcontrollerディレクトリに放り込んじゃいました。 別ディレクトリに入れてautoloadさせても良いと思います。 [モジュールとアクションを作成]agaviコマンドから作成。サンプルではモジュール[Default]、アクション[CD]にしています。[configの類]/path/to/webapp/configに各種configファイルがあります。■config.php S2Container.phpとS2Dao.phpをrequire_once。 PDO_DICONやS2DAO_PHP5_USE_COMMENTなどのdefineもココで。 SmartyのPATHも記述しておくと幸せになれます。 ■contexts.ini S2AgaviControllerを使うようにセットします。 ■autoload.ini サンプルではIface/ImplファイルやBean/Daoファイル等をwebapp/modules/Default/logic以下に適当なディレクトリを作って配置していますのでそこを指定します。
以上でAgaviとS2Container.PHP5/S2Dao.PHP5を組み合わせるセッティングは完了。
実際に動かしていきます。 ココでは極々基本的な使い方をします。CDActionにてDaoを受け取り→表示になります。 [データベースの準備]Symfony feat. S2Container.PHP5で使ったものを流用。[CDAction.class.php]Daoをインジェクト出来るようにセッターを用意。[CD.dicon]webapp/modules/Default/dicon/CD.diconを配置。[Cd1Dao.class.php/CdBean.class.php]S2Dao.PHP5のexamplesに入っているものを。ただしコメントアノテーション用のではありません。[pdo.dicon/dao.dicon]webapp/lib/db下に配置してます。お好きなところに。[テンプレート編集]CDSuccess.php[テスト]Cd1Daoをテストします。Agaviに用意されているテストは流用し難い。 今回はプロジェクトディレクトリにs2unitというディレクトリを作ってそこで作業します。 S2Container.PHP5で用意されているテストを使います(simpletest)。設定等々はサンプルを見て貰えれば。 S2Containerとは関係ない部分が多いんですけども、AgaviのActionを継承せずにPOPO(Plain Old PHP Object)をActionとして振舞わせてみます。 現行のAgaviでもActionのメソッドを全部突っ込めば動くと思うんですが、その辺はお手軽な感じにしてます。 内容は右辺と左辺の合計を5にする、というフォーム使った処理。 特にコレと言った設定は無し。 Actionがインターフェースであれば独自のExecutionFilterを呼び出します。 パラメータ関係はRequestDtoが持って回ります。セッションはまだ思案中。 まだ全然使い物にはならんのですが、こんな可能性も秘めているんだぞ、というプレビューをば。 [PopoAction.class.php]インターフェースを用意します。[PopoImpl.class.php]実装部分です。Agaviで使用するメソッドを書いて行きます。戻り値は文字列で。 getRequestMethods/getDefaultView/validate/executeが使えます。 フォームデータはRequestDto#getFormから「get + フォームの要素名」で取り出せます。 getForm()->getLeft()って感じ。 RequestDtoを受け取るセッターも用意しておきます。Dtoはインターフェースがあるのでautobindさせます。 [Popo.dicon]RequestDtoの呼び出しとPopoImplのバインド。[PopoInput.html/PopoSuccess.html]通常のAgaviではViewクラスを用意する必要があるんですが、内部的にSmartyViewを呼び出すようにしてます。テンプレート名は「ACTNAME + 戻り値 + .html」になります。「return 'Success'」なら「PopoSuccess.html」になる、っちゅー体。 [validate]S2Containerを全く使わないのもアレなんでコメントアノテーションでvalidateしてみました。validator自体は横着してAgaviのモノを使ってます。 が、諸般の事情で正規表現は使えません。 というかカンマが入ってるものは全部ダメ。 validate結果がfalseだった場合、自動的にPopoError.htmlに叩き、PopoError.htmlが存在しなければPopoInput.htmlへ回します。 つまり、エラーならもっかいInputに回すよー、って方式ならばPopoInput.htmlだけ用意してエラーメッセージを予め挿しておけばいいわけです。 エラーメッセージ用の変数は$errorMsg。 ■まとめと考察単純にAgaviとS2Container.PHP5を組み合わせるのは問題無いと思います。POPOをActionとして振舞わせる方はまだまだ。AnnoReaderをガッツリ書き直さないといけない。 validatorもスクラッチしたほうがよさげ。 まあまあ「こんなFWあったらおもろいよね」ってのには一歩近づいているような気がします。 気がするだけです。 |
クイックサーチABOUTARTICLES最近のエントリ
TUMBLRカテゴリ管理 |