標籤雲

搜尋此網誌

2010/10/25

Zend_Amf 入門

上一篇整理了 Flash 的資料交換方式,這次要開始慢慢切入正題
Flash Remoting 是 swf 使用 AMF 二元資料格式與伺服器的 Remoting Component 進行資料交換的技術(透過 HTTP)
在 PHP 有 amfphp, Zend_Amf 等
但由於 PHP 5.3 與 amfphp 1.9 在 localhost 測試時會出現錯誤
在找不到解決方法下,我打算改由 Zend_Amf 來上手

Zend Framework 是 Zend 公司針對 PHP 企業級開發的 Framework,而 Zend_Amf 就是其中的一組函式庫
取得的方法很簡單,只要上官方網站下載後解壓縮打開即可

而我是使用 svn 的方式來取得,既然是寫入門還是說清楚一點好了:
1. 首先如果 PC 裡沒有安裝 svn 軟體,可以下載安裝 TortoiseSVN (俗稱小烏龜)軟體
2. 在電腦裡開一個資料夾並命名,如 Zend Framework,按右鍵選擇 SVN Checkout,網址輸入 http://framework.zend.com/svn/framework/standard/trunk
3. 此時會跟網址上的檔案進行版本更新,但因為 Zend Framework 並不是很小,所以等它跑完大約需要幾分鐘

至於布署方式,只要把 library 的內容放到網站目錄下即可
(租用虛擬主機空間時由於無法更改主機設定故要用這種方式來布署)
我是選擇直接在 php.ini 裡做 include 設定,檔案就不用貼來貼去占空間
include 的方法如下:只要找到 include_path 這一行,然後以分號分隔把路徑加上去即可
路徑請記得改成自己的...

; Windows: "\path1;\path2"
include_path = ".;c:\php\includes;C:\Zend Framework\library"

這樣安裝跟布署就完成了!!

接下來還有一個重點就是要設定 Gateway 程式
在網頁目錄下新增一個 zend_gateway.php 輸入以下程式碼
並開一個子資料夾來放 remoting component,本例為 AMFapp/

<?php
//匯入 Zend/Amf/Server.php 檔案
require_once 'Zend/Amf/Server.php';

// 建立 Server 物件
$server = new Zend_Amf_Server(); //由於檔案是在 Zend/Amf/ (套件路徑)下,所以 new 的時候要寫為 Zend_Amf_Server
$server->addDirectory('AMFapp/'); //呼叫  Zend_Amf_Server 的 addDirectory 方法,將指定路徑下的檔案自動加進來

//呼叫 handle 方法處理資料並放入 $response 裡輸出
$response = $server->handle();
echo $response;
?>

而在 AMFapp 裡,開一個 HelloWorld.php 來測試吧
<?php
class HelloWorld{
 /**
  * 就是 Hello World 啦!!
  * @param string $arg
  * @return string
  */
 function sayHelloWorld($arg = ""){
  $returnValue = "Hello Zend_Amf!! 如果看到這就成功嚕!!". $arg;
  return $returnValue;
 }
}
?>

接下來是 ActionScript 的部分:(關於 NetConnection 的詳細內容請參閱官方文件)
package {
 import flash.display.*;
 import flash.net.*;
 
 public class MyTest_zend_01 extends MovieClip {
  private var ncZend:NetConnection;
  private var rsZend:Responder;
  
  public function MyTest_zend_01() {
   //建立 NetConnection 物件
   ncZend = new NetConnection();
   //將 Gateway 的完整路徑傳入 connect 方法
   ncZend.connect("http://localhost/zend_gateway.php");
   //建立 Responder 物件,指定回應與錯誤的 callback func
   rsZend = new Responder(onResult, onFault);
   //呼叫 call 方法開始連線
   //注意這裡是用 SomeClass.SomeFunc 的表示方式
   ncZend.call('HelloWorld.sayHelloWorld', rsZend, "這是傳入的字串");
  }
  //回應處理函式
  private function onResult(result:Object):void {
   trace(result);
  }
  //錯誤處理函式
  private function onFault(err:Object):void {
   trace("fault:");
   for (var i:String in err) {
    trace(i, ":", err[i]);
   }
  }
 }
}
測試發布時如果看到 output 有 trace 出訊息就表示成功了!!

沒有留言: