Zend_Amf_Server + AS3
2009年06月01日 23:43
個人的に勉強していた Zend_Amf_Server を実レベルの仕事で初めて Flash Remoting として使ってみた。プロジェクトは Flash ゲームで、もう 1 人の Flash デベロッパーと連携してゲーム以外の AS3 のバックエンド/モデルクラス/ビュークラス/コントローラ系のプログラム、Remoting 系、PHP/MySQL 開発、サーバ少々を担当。
Zend_Amf_Server は物凄くいいですね。何がいいかって Zend を普通のウェブアプリケーション感覚で開発できるので連携するバックエンド部分を MVC で組めるし、Zend_View_Smarty とか Zend_Db_Table とか Zend_Registry とか Flash と連携することを意識しないで使えるから超楽だ。Zend を使ってる Flash デベロッパーなら学習コストなし。PHP/MySQL 系のウェブアプリケーションに作っていた Zend のクラス群を Flash Remoting 用にそのまま引っ張ってきて再利用できたので、よっぽどシステムがでかくなければ簡単に作れちゃう感じですな。
で、Zend_Amf_Server で注意したい点を忘れないようにメモッておく。
(1)
まずは基本的なエラーがあるか確認するため Zend_Amf_Server の end point になるgateway.php とか server.php をブラウザでアクセス。正常な場合はダウンロードされる。出ないときはプログラム側でエラーがある。
(2)
開発時は setProduction(false) に設定する。(これは必ずリリース時に true かもしくはコメントアウトする。)これで、NetConnection.call で呼んだときに Responder の status イベントハンドラ内でエラーの詳細を取得できる。
$server =& new Zend_Amf_Server(); $server->setProduction(false);
private function onStatusHandler(fault:Object):void
{
for(var key:String in fault)
{
trace(key);
trace(String(fault[key]));
trace('===');
}
}
(3)
"Unhandled NetStatusEvent:. level=error, code=NetConnection.Call.BadVersion" とか Responder の status イベントハンドラ内でエラーが出ているけど詳細が良く分からない場合は、大抵 PHP のクラス側(Flash の View から呼び出されるメソッド群を保持している Controller/Business 的クラス)内で何かかしらエラーが出ているんで、gateway.php の echo 部分をコメントアウトして、クラスをダンプでもしてみる。ここで大抵エラーが返ってるから、display_errors が on なら詳細が見えるはず。
$server =& new Zend_Amf_Server();
//$server->setClass('UserBusiness');
$response =& $server->handle();
//echo $response;
$ub =& new UserBusiness();
Zend_Debug::dump($ub);
(4)
それでもどうしても分からないエラーに関してはファイルに書き出して Dump 内容を見る必要があるかも。Zend_Mail とかで役立ちました。以前作った FileDumper クラスを PHP 5 に書き換えて、Base の Controller クラスに protected 変数として入れ込んでおいた。
(5)
データ通信には VO を使う。Flex なら AS 側の Model クラスを Bind してるから VO は有効だけど、AS オンリーのプロジェクトでも VO で通信し合って、VO のマッピングには setClassMap クラスを使うのが楽。マッピングしてないでオブジェクトを返すとすべてのコールに対してエラーが発生したりする。
$server->setClassMap('UserVO', 'UserVO');
ということで、flash94 を参考に、フロントエンドに Flex/Cairngorm、バックエンドは Zend_Amf 使って本格的に Flash CMS 作り始めた。1ヶ月で仕上げる。
