サーバ側のコードを理解する
次に、これを受けるZend_Amfの方の処理を見ていきましょう。まずは、AMFのリクエストを直接受けるコントローラです(リスト5)。
<?php
...
//(1) メソッドとして登録する関数
//AMFの処理をするためのメソッド
function getString()
{
return "サンプル文字列\n";
}
//(2) メソッドを提供するクラス
//AMFの処理をするためのクラス
class MyService
{
public function getTime()
{
return date("y/m/d H:i:s");
}
}
class IndexController extends Zend_Controller_Action
{
...
//(3) index/amf で呼び出される処理
public function amfAction()
{
//(3-1)通常の描画を無効にする
$this->_helper->viewRenderer->setNoRender(true);
//(3-2)Zend_Amf_Serverのインタンスの作成
$server = new Zend_Amf_Server();
//(3-3)MyServiceクラスを登録
$server->setClass('MyService');
//(3-4)getHelloString関数を登録
$server->addFunction('getHelloString');
//(3-5)/codezine/zendapps/servicesフォルダ配下のクラスを登録
$server->addDirectory('/codezine/zendapps/services');
//(3-6)オブジェクト間の対応関係
$server->setClassMap('DataAS', 'DataPHP');
//(3-7)リクエストを処理
$result = $server->handle();
//(3-8)結果を返す
echo $result;
}
}
リスト4の(1-3)にあったように、Flashアプリが呼び出すアドレスは「http://localhost/index/amf」となります。この場合、実際に対応するのは(3)にあるIndexControllerクラスのamfActionメソッドになります。
このメソッドは通常の描画を行うのではなく、Flashアプリからのリクエストに答えるためのものなので、(3-1)で通常の描画を行わないように設定しておきます。この次の(3-2)でZend_Amf_Serverのインスタンスを作成した後、(3-3)と(3-4)、(3-5)ではそれにメソッドの追加を行なっています。
(3-3)では(2)のMyServiceクラスのメソッド(この場合はgetTimeメソッドのみ)を登録しています。ここで登録されたメソッドは「MyService」サービスの「getTime」メソッドのように扱われます。
(3-4)では(1)のgetHelloString関数をメソッドとして登録しています。このように指定した場合は、サービス名にかかわらずメソッド名が一致したらこのメソッドが呼び出されるようになります。
また、(3-5)ではメソッドが登録されているクラスの定義ファイルが置かれているフォルダを指定しています。このようにクラスの定義ファイルを定義しておくと、AMFを処理するためのメソッドを、このフォルダにも探しに行くようになります。例えば、サンプルのようにHelloWorldサービスのメソッドが呼ばれた場合には、「/codezine/zendapps/services」の中に「HelloWorld.php」がないかを探してくれるようになります。
(3-6)はFlashとPHPの間でのクラスの対応関係を指定しています。今回の例ではオブジェクトのやりとりをしているので、このような指定が必要になります。こちらについては後で詳しく説明します。
最後に(3-7)のhandleで実際に処理を行なった後、その結果を(3-8)でFlashアプリに返しています。
これを実際に処理しているのはHelloWorldクラスのgetHelloStringメソッドです。
<?php
class HelloWorld
{
/**
* @param DataPHP $param
* @return string
*/
public function getHelloString($param)
{
return $param->data." Test for codezine\t".date("y/m/d H:i:s")."\n";
}
}
これはDataPHP型(後述)のオブジェクト受け取り、そこから取り出した文字列を加工して(具体的には時刻などの文字列を追加して)、文字列を返すメソッドになっています。
リスト3からリスト6の一連の処理の流れをまとめると、
- ユーザーがFlashアプリのボタンを押す
- 「http://localhost/index/amf」に対してAMF3で
getHelloStringメソッドをリクエスト - 登録されたメソッドのうち、
HelloWorldクラスのgetHelloStringメソッドが実行される getHelloStringメソッドの結果がFlashアプリに送り返される- その結果をテキストエリアに追加
のようになっています。
