(18)サーバサイドをAMFPHPにする

hirossy19772007-03-04


今回は、サーバー側にAMFPHPを利用してみます。
AMFPHPについての詳細は、またの機会に。

前回に引き続きs2flex2-exampleのaddService(足し算アプリ)を使用し、必要な部分を改造します。

AMFPHP1.2.5
PHP4.4.4
です。

まず、Flex2から単純にAMFPHPに接続する例

asでは、
■add_script.asのcalculate()メソッド内を以下の内容に変更

・・・
    var con : NetConnection = new NetConnection();
    con.connect("http://yourdomain/yourpath/amfphp/gateway.php");
    // AMFのばーじょんを入れる(AMF0でもAMF3でもいけたっぽい?)
    con.objectEncoding = ObjectEncoding.AMF3;
    var responder:Responder = new Responder(onResult, onFault);
    // 第3引数以降にメソッドのパラメータを入れる
    con.call("AddService.calclate2", responder, arg1_txt.text, arg2_txt.text );
・・・

PHPでは、AddService.phpをamfphp/services/に作成
■AddService.php

<?
/**
 * テスト
 * AMFPHPによってFlash側にメソッドを公開するサービスクラス。
 */
class AddService{
    var $methodTable;
    /**
     * コンストラクタ。
     * $methodTableに公開するメソッドを登録します。
     */
    function AddService(){
        $this->methodTable = array(
            "calclate2" => array("description" => "Function getContents test",
                                    "access" => "remote",
                                    "arguments" => array("num1","num2") ));
    }

    function calclate2( $num1, $num2 ){
        return $num1 + $num2;
    }
}
?>

ちゃんと足し算した結果が返ってきます。
ちなみに引数がDTOじゃなくなっていますが、DTOでも大丈夫です。(但し、PHP側で配列かなんかに変換されると思う。。)

で、本題のs2flex2-componentsを利用して接続する方法

■Application.mxml(サンプルだとadd.mxml)

・・・
<s2:S2Flex2Service id="addService" destination="AddService"
    gatewayUrl="http://yourdomain/yourpath/amfphp/gateway.php"
    result="onResult(event)" fault="onFault(event)" showBusyCursor="true" />
・・・

■add_script.as

・・・
    var num1 :Number = Number(arg1_txt.text);
    var num2 :Number = Number(arg2_txt.text);
    addService.calclate2(num1, num2);
・・・

これでOK。
結果の戻り値がNetConnectionをそのまま使う場合とは違うので注意。
■onResult(ret:Object)内

    var retObj:String = ret.result;

以下は解説。

NetConnectionを実行しているのは、S2Flex2Serviceクラス内の以下の部分。
■メソッドを実行しているところ(dynamicクラスなので。)

    flash_proxy override function callProperty(methodName:*, ...args):*{
        args.unshift(methodName);
        return remoteCall.apply(null,args);
    }

remoteCall()呼び出し。apply()で実行しているので、メソッド名が実質、第一引数になる。
■NetConnection.call()しているメソッド(remoteCall()。)

    private function remoteCall(methodName:String, ...rest):AsyncToken {
        setupConnection();
        setupCredentials();
        setupRemoteCredentials();
        setupCursor();

        var callMethod:String =this.destination +"." +methodName;

        var responder:RelayResponder = new RelayResponder(methodName,this.onResult,this.onFault);
        this._opResponderArray[methodName]=responder;

        if(rest.length>0){
            rest.unshift(callMethod,responder);
            _con.call.apply(_con,rest);
        }else{
            _con.call(callMethod,responder);
        }
        return responder.asyncToken;
    }

NetConnection.call()しています。そしてAsyncTokenを返しています。


おしっ!いけた。
呼び出すメソッド名をタイプミスしててえらく時間をとってしまいました。


次回から、サンプルアプリケーションを作成してゆきたいと思います。
FxUGにて、pepeさんとnodさんのファイルアップローダーを見つけましたので、
S2Flex2+Cairngorm2.1+ファイルアップローダー用サーブレットで、画像パレットを作成してみます。

たぶん、2週間くらいかけて作ると思います。


次回は、Cairngorm2.1+S2Flex2で画像パレットを作成しよう です。