ワンポイント
Dao
今回作成したアプリケーションでは、サーバからの受信するデータはJSON形式である点に注目してください。また、そのJSONデータの加工に必要な手間はほとんどかけていません。今回は、データ取得に使うDaoのメソッド名の終了文字を「Json」としただけです。
<?php interface TabDao { const BEAN = "TabEntity"; // この定数は、QUERYアノテーションに使われています。 const findAllJson_QUERY = "order by id"; // メソッド名の後ろにJsonを付け加えただけ public function findAllJson(); const getTabJson_QUERY = "id = /*id*/1"; // 単一のオブジェクトを返す場合も同様 public function getTabJson($id); // 以下はコメントアウトされていたもの public function update(TabEntity $entity); public function insert(TabEntity $entity); public function delete(TabEntity $entity); } ?>
Daoインターフェイスに定義されているfindAllJson
メソッドやgetTabJson
メソッドはS2Dao.PHP5で定義さえているメソッドの命名規則に合わせることで、JSON出力を行っています。今回、JSONでデータをやりとりするために必要な処理は、メソッドの命名規則に合わせることのみとなります。
S2Dao.PHP5がJSONデータを出力するためには、「php-json」という拡張モジュールを入れる必要があります。
最近では、PHP5.2.0で標準で導入されるようになりましたが、PHP5.1.6などを使われている方はpeclなどからインストールする必要があります。
通常は以下のコマンドでインストールすることができます。
pecl install json
Actionクラス
Action
クラスでは、JSONで取得したデータはheader
関数を使いX-JSONヘッダに格納しています。以下は作成したListAction
になります。
<?php class ListAction implements S2Base_Action { private $service; public function execute(S2Base_Request $request, S2Base_View $view){ header('X-JSON: ' . $this->service->getAll()); } public function setService(TabEditService $service){ $this->service = $service; } } ?>
JavaScriptとJSON
上記のようにAction
クラスに実装することで、「prototype.js」などのフレームワークを使う時に、X-JSONヘッダに格納された文字列をJavaScriptのオブジェクトへ変換してくれます。クライアント側で使用している「tab.js」は次のようにすることで、変換されたJSONの値を利用しています。
create: function(){ var config = this.config; this.ajax = new Ajax.Request(config.form.action + 'List', { method: 'get', evalScripts: true, parameters: Form.serialize(config.form.name), onFailure: this.onFaliure.bind(this), onComplete: this.onComplete.bind(this) }); Event.observe(config.event.get, 'click', this.doGet.bindAsEventListener(this)); Event.observe(config.event.add, 'click', this.doAdd.bindAsEventListener(this)); Event.observe(config.event.modify, 'click', this.doModify.bindAsEventListener(this)); Event.observe(config.event.remove, 'click', this.doRemove.bindAsEventListener(this)); }, onFaliure: function (transport){ var config = this.config; var content = $(config.tabContent); content.innerHTML = config.ajax.failure; }, onComplete: function(transport, json){ if(json){ if(json.length < 1){ this.index.push(new EmptyTab({}, this.config)); } else { var self = this; json.each(function(jsobj){ self.index.push(new Tab(jsobj.TabEntity, self.config)); }); } } else { this.index.push(new EmptyTab({}, this.config)); } },
「prototype.js」で利用可能なAjax.Request
のオプション項目としてevalScripts: true
を設定しています。こうすることで、X-JSONとなっているヘッダに格納されている文字列はJavaScriptオブジェクトに変換してくれます。また、JSONオブジェクトの受け取りはonComplete
メソッドで定義している通り、第二引数へ格納されます。
onComplete: function(transport, json){
:
: (省略)
:
},
上記のことを踏まえ、イメージにすると次のようになります。
基本的にはS2Dao.PHP5が出力したJSONデータはそのまま利用し、「prototype.js」がヘッダ情報からJSONデータを読み取り、JavaScriptで処理していくことになります。無事、JSONを受け取ることができれば、後は軽快な画面を作成するだけです。
私が作成したサンプルアプリケーションはlabs.s2php5.jpに公開しています。動作確認などをしてみてください。
テストについて
S2Base.PHP5はデフォルトでテストクラスの生成も行ってくれます。昨今の開発現場では書かせないTDDの開発はもちろんS2Base.PHP5はサポートしています。テスト手法とそのムービーは開発者の手によって公開されています。
今回はテストまでは行いませんが、上記のリンクからS2Base.PHP5によるテスト手法を見ることが可能です。必要に応じて参照してください。
最後に
いかがでしたでしょうか。S2Base.PHP5とS2Dao.PHP5を用いたWeb2.0風アプリケーションの作成の過程を前後編に渡って一通り紹介しました。基本的にはデフォルトで出力されるファイルを少し編集するだけで、細かい設定などを行う必要はなかったと思います。しかしながら、今回の作成したアプリケーションの裏側ではS2Container.PHP5やS2Dao.PHP5が動いています。S2Container.PHP5によるAOPサポートやS2Dao.PHP5による便利なO/Rマッピングも問題なく行うことが可能です。
今回作成したアプリケーションを参考にS2Containerにも触れていただければ、より拡張性の高いアプリを作成することも可能になると思います。