SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

S2Baseで作るWebアプリケーション

S2Base.PHP5とS2Dao.PHP5で作るWeb2.0風アプリケーション 後編

S2Baseで作るWebアプリケーション


  • X ポスト
  • このエントリーをはてなブックマークに追加

ワンポイント

Dao

 今回作成したアプリケーションでは、サーバからの受信するデータはJSON形式である点に注目してください。また、そのJSONデータの加工に必要な手間はほとんどかけていません。今回は、データ取得に使うDaoのメソッド名の終了文字を「Json」としただけです。

dao interface
<?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データを扱うために
 ここで注意があります。
 S2Dao.PHP5がJSONデータを出力するためには、「php-json」という拡張モジュールを入れる必要があります。
 最近では、PHP5.2.0で標準で導入されるようになりましたが、PHP5.1.6などを使われている方はpeclなどからインストールする必要があります。
 通常は以下のコマンドでインストールすることができます。
PECLから拡張モジュールのインストール
pecl install json
 詳しくはpecl.php.netのjsonのページを参照してください。

Actionクラス

 Actionクラスでは、JSONで取得したデータはheader関数を使いX-JSONヘッダに格納しています。以下は作成したListActionになります。

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の値を利用しています。

tab.js
    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
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にも触れていただければ、より拡張性の高いアプリを作成することも可能になると思います。

参考

  1. SeasarConfrence 2006 Autumn で発表された資料(PDF)
  2. S2Base.PHP5のプロジェクトページ
  3. S2Container.PHP5のプロジェクトページ
  4. S2Dao.PHP5のプロジェクトページ
  5. labs.s2php5.jpのwiki
  6. PECL :: Package :: json
  7. Prototype JavaScript Framework: Class-style OO, Ajax, and more
  8. prototype.js v1.4.0 の使い方
  9. IBM JSON を使ったキャッシング

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
S2Baseで作るWebアプリケーション連載記事一覧
この記事の著者

ハタ(ハタ)

PHPの魅力に取り付かれた一人。現在はSeasar.PHPとしてSeasar(Java)をPHP5に移植する活動をしている。http://blog.xole.net/(ブログ)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/744 2007/04/13 13:02

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング