tonextone.com/note/

Last-modified: 2006-09-01 (金)

Copyright ©master_at_tonextone.com All rights reserved.

MVC2.0 その2

Posted : 2005-12-06 21:00 / Category : [開発日誌]
MVC2.0 その1」の続き。
web2.0 時代の AJAX なウェブアプリケーションにおける MVC について。

良さげな AJAX ライブラリを比較

PEAR::HTML_AJAXXOAD とを比較する。
HTML_AJAXは、昨日 0.3.1 が出たらしいので、
$ pear install "channel://pear.php.net/HTML_AJAX-0.3.1"
XOAD は普通に一式サーバにアップロードで OK 。

共通点

共通点を説明するために、勝手に用語を導入する。
AJAXify
サーバサイドで定義されたクラスを AJAX 的に利用できるようにする事を「AJAXify」と呼ぶ。
HTML_AJAX, XOAD では、
サーバサイド(PHP)で定義されたクラスを
クライアントサイド(JavaScript)からコールする際に必要な、
クライアントサイドのコードを自動生成する機能を提供している(Sajax, JPSPANも同様)。
これを「AJAXify」ユーティリティと呼ぶ。
HTML_AJAX では、この機能の事を proxy と呼んでいるらしい。
HTML_AJAX の作者の blog 'There and Back Again'では mapped_functions とか呼んでいる。
簡単なクラス( _String.class.phps )を AJAXify してみると、当然似たようなコードになる( コードの比較 )。
動作デモはこちら。 HTML_AJAX, XOAD.

相違点

  1. HTML_AJAX の「AJAXify」ユーティリティは、
    クライアントサイドの「AJAXified」クラス(プロトタイプ)をサーバサイドで自動生成するので、
    プログラマはこのクラスから「AJAXified」インスタンスを生成する JavaScript コードを書く。
    この際、コンストラクタの引数としてコールバックオブジェクトのインスタンスを指定する。
    <script>
    var object = new _String(callBack);
    var anotherObject = new _String(callBack);
    </script>
    <button onClick="object.returnFromPHP('JS> how are you?\n')">click!</button>
    <button onClick="anotherObject.returnFromPHP('JS> again, how are you?\n')">click!</button>
    
    一方、XOAD の「AJAXify」ユーティリティは、
    クライアントサイドの「AJAXified」インスタンスをサーバサイドで自動生成するので、
    プログラマはインスタンスを生成する JavaScript コードを書かない。
    その代わり、「AJAXified」インスタンスのメソッドの引数にコールバック関数を指定する。
    <script>
    var object = <?= XOAD_Client::register(new _String()) ?>;
    var anotherObject = <?= XOAD_Client::register(new _String()) ?>;
    </script>
    <button onClick="object.returnFromPHP('JS> how are you?\n', callBack)">click!</button>
    <button onClick="anotherObject.returnFromPHP('JS> again, how are you?\n', callBack)">click!</button>
    

  2. HTML_AJAX では、 server.php
    <?
    include_once('HTML/AJAX/Server.php');
    $server = new HTML_AJAX_Server();
    /*
     * 必要ならここでいろいろ設定。
     * でもどんな設定ができのか不明。
     */
    $server->handleRequest();
    ?>
    
    とか言うのを作って置く必要があるが、
    XOAD では不要。

  3. HTML_AJAX では、
    <?
    $ajax =& new HTML_AJAX();
    $ajax->registerClass((new _String()),'_String',array('returnFromPHP'));
    ?>
    
    みたいに、クラス名、メソッド名のマッピングも「AJAXifiy」と同時にできる。

    一方、XOAD では、
    <?
    XOAD_Server::allowClasses('_String');
    ?>
    
    で済むんだけど、その代わり「AJAXify」したいクラスに、
    <?
    class _String
    {
      /* snip */
    
      function xoadGetMeta()
      {
        XOAD_Client::mapMethods($this, array('returnFromPHP'));
        XOAD_Client::publicMethods($this, array('returnFromPHP'));
      }
    }
    ?>
    
    みたいにメソッド名をマッピングするメソッドを追加する必要があり、ちょっとウザい。

  4. HTML_AJAX では、
    XMLHTTPRequest で送信されるデータ、サーバから戻ってくるデータ共に、
    <script>
    HTML_AJAX.defaultEncoding = 'JSON';
    </script>
    
    で指定したエンコーディングが使われるらしい。
    'JSON' 以外のオプションは 'NULL' って言うのがあるけど、それ以外は不明。

    一方、 XOAD では、
    XMLHTTPRequest で送信されるデータは PHP の serialize(); 形式、
    サーバから戻ってくるデータは JSON。
    POST を監視するとこんなのがサーバに飛んできました。
    a:4:{s:6:"source";s:18:"O:7:"_string":0:{}"; \
         s:9:"className";s:7:"_string";s:6:"method";s:13:"returnFromPHP"; \
         s:9:"arguments";s:35:"a:1:{i:0;s:17:"JS> how are you?";}";}
    
    JavaScript で、 XOAD.serialize(); している。
    お互いに相手に合わせてる感じ(笑)。良いのか悪いのか。

  5. ちなみに、クライアントライブラリとして読み込まれる JavaScript の行数は、
    HTML_AJAX : 2681
    XOAD : 611

考察

疲れたので、一服してから別エントリとして。

参考URL

[HTML_AJAX]
HTML_AJAX 作者の方によるスライド
HTML_AJAX 作者の方の関連記事
多分同じ人によるexamples

[XOAD]
公式ページ

トラックバック

(2)

ツッコミ

1: master (12/12 12:33)
HTML_AJAX, XOAD ともに、JSON を PHP のデータとして自動展開するが、
その際、PHP のオブジェクトとして展開する。
これを連想配列として展開するように変更するためのクラスメンバがない。
XMLHttpRequest の POST/GET を切替えるためのメンバもない。
結局、この辺が分かりやすい Sajax はかなり使える。
[ このエントリへはツッコミ出来ません ]