AMFPHPでHelloWorld!!

Flexを利用してアプリケーションを組むときに[Flex]⇔[サーバ]間との通信をどうしようかなと迷います。WebAPIを組むことになると一苦労。APIを設計するという作業が待っています。Flashには[Flash]⇔[サーバ]間の連携を強力に行うFlashRemotingという方式があってPHPではAMFPHPを使ってできるよと教えられたのでAMFPHPを使ってHello World!!をする実験メモです。

以下実施の手順

  1. AMFPHPの配置
  2. ゲートウェイとなるPHPの作成(Gateway.phpの作成)
  3. サービスとなるPHPの作成(Service.phpの作成)
  4. 検証用のmxmlファイルの作成

実験に使ったソースコード

Gateway.php
<?php
include 'amfphp/core/amf/app/Gateway.php';

function main()
{
    $gateway = new Gateway();
    $gateway->disableDebug();
    $gateway->setClassPath(".");
    $gateway->enableGzipCompression(25*1024);
    $gateway->service();
}

// call main function
main();
Services.php
<?php

class Service
{
    public function sayHello(){
        return 'Hello World!!';
    }
}
main.mxml
<?xml version="1.0" encoding="UTF-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*">
    <mx:Script>
    <![CDATA[
        import mx.controls.*;
        import flash.net.*;

        // ゲートウェイのパス
        private const GATEWAY:String = "/Gateway.php";

        public function doRequest():void
        {
            var responder:Responder = new Responder(onSuccess, onFault);
            var connection:NetConnection = new NetConnection();

            connection.connect(GATEWAY);
            connection.objectEncoding = ObjectEncoding.AMF3;
            connection.call("Service.sayHello", responder);
        };

        /** 通信成功時  **/
        private function onSuccess(any:*):void{
            Alert.show(any.toString());
        };

        /** 通信失敗時  **/
        private function onFault(any:*):void{
            Alert.show("通信失敗");
        };

    ]]>
    </mx:Script>
    <mx:Button label="テスト" id="idTest" click="doRequest()" />
</mx:Application>
ディレクトリ構成

簡単の為に全てDocumentRoot直下に配置しています。

/main.swf
/Service.php
/Gateway.php
/amfphp/

所感

意外とあっさり動いたので楽だと思います。WebAPIを書く場合、JSON形式で吐き出す内容の仕様やXMLでどんなデーター形式を返せばいいのか?と設計の必要がでてくるのですがそんなこと考えなくて直観的に扱えるのでなかなかよさげでした。