在Flex中,我們是不能直接與php溝通的,必須要通過http request或是remote的方式來交換數據,速度和安全性上當然是remote佔優勢,HttpService的做法已經用到爛掉了,網路上已經有驚人的資源可以搜尋,但是remoting的方式卻是千奇百怪,這邊使用常見的amfphp來作為flex與php中間的媒介,簡單來說就是一連串的橋接動作,把資料從php一路接來flex前端
因為AS不能直接建立一個PHP物件,所以Flex提供了RemoteObject來作為Flex端的遠端物件(後面稱為RO,不是那個網路遊戲!),就如同我們常用的遠端桌面一樣,RO只是一個輸入和出輸出界面,本身並不作程式執行,運算的部分都是php在負責的,所以會影響到Flex的是RO回傳的結果(在遠端桌面就如同我們看到的畫面),其實是相對安全的(遠端電腦掛了我們電腦也不會有事),有沒有一點VM的味道呢?我們(Flex)只是站在RO旁邊指揮的旁觀者而已
AMFPHP的AMF,全名是Action Message Format,很明顯的就是物件導向,指揮PHP物件應該要如何動作,也就是說一定得要是class才可以被實作執行,一般的PHP敘述在AMFPHP是會造成錯誤的
我們可以從遠端桌面的例子來思考,建立一個遠端桌面需要哪些要素?
最基本的就是電腦IP吧!
在這邊AMFPHP提供了一個Gateway檔案,叫做gateway.php,她是一個程式的出入口,負責幫我們把Flex呼叫的PHP物件找出來
這邊我用了一個簡單的例子來介紹RO,使用上一次我們寫好的Hello物件
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.mxml.RemoteObject;
public function remoteStart():void
{
var service:RemoteObject = new RemoteObject(); //建立一個RO物件
service.addEventListener(ResultEvent.RESULT, resultHandler); /*執行正確*/
service.addEventListener(FaultEvent.FAULT, faultHandler); /*錯誤處理*/
service.source = “Hello”; //要實作的php物件
service.destination = “amfphp”; //你不會想去改他的
service.endpoint = “http://localhost/amfphp/gateway.php“; //gateway.php的位置
service.say(“aaa”); //呼叫say function
}
public function resultHandler(evt:ResultEvent):void{
trace(evt.result);
}
public function faultHandler(evt:FaultEvent):void{
//處理加載錯誤
trace(“fault:”+evt.fault);
}
執行remoteStart()之後我們可以在debug視窗看到aaa的trace字串顯示,代表我們已經成功執行php物件了