FLEX on PHP , 使用 ZendAMF remoteObject
ZendAMF 好熟悉的名字,上次詳盡的介紹過 AMFPHP 與 FLEX 之間的互動後,怎麼又跑出 ZendAMF 呢 ? ,而且也是 AMF ,那 Zend 又是甚麼東西 ? 原來 ZEND 是一家公司,所開發的東西有許多,包含 Zend Optimizer 或是 IDE 工具 Zend Studio ,當然還又更膾炙人口的 Zend Framework ,沒錯 ! ZendAMF 就是屬於 Zend Framework 的功能,並且這項功能是由 Adobe 官方協同發展喔。
圖片:Adobe 與 PHP 的合作,使用 ZF with AMF 來開發你下一個 RIA 吧 !
ZEND FRAMEWORK,在台灣似乎沒甚麼人知道,也沒甚麼人玩,當然有,畢竟少數,ZEND 本身也有出 PHP 的認證考試,相信在台灣的朋友應該也不少人有,而最近資策會也要於 2009/3/16 開 ZEND 認證課程,很可惜的是人數不夠,截至今日(12日)都還不知道課程會不會開得成功。
我們先撇開 ZF 不談,我們來說說 ZEND STUDIO 吧,這是一套由 ZEND 公司所出品的 IDE 工具,也是基於 Eclipse 作開發,跟 FLEX BULIDER 是一樣的,還記得我們的文章 FLEX on PHP , use AMFPHP remoting 中,曾經提過一套 IDE 工具 [ PDT ] ,其實這套也是 ZEND 公司所發展的免費 IDE 工具,當然 ZEND STUDIO 更多了些強大的功能,包含了 DEBUG 等,當然還有內建 ZEND FRAMEWORK 囉,雖然這麼強大的軟體並不是免費的,但是反觀台灣的 PHP 市場似乎都還是使用 Dreamweaver 或是 UEDIT 在做 PHP 的編碼動作,PHP 已經慢慢由以往的直譯式語言慢慢的向 JAVA 等物件導向語言靠攏,而 PHP 更慢慢的拓展物件導向的觀念,加上慢慢的 AJAX 以及更多的 FRAMEWORK 如 SMARTY 或是 CAKEPHP 等等,是不是該更新你手邊的工具了呢 ?
最後來談談 ZEND AMF 吧,為什麼我們要用 ZEND AMF 呢? AMFPHP 不是用得好好的了嗎 ? 關於這點國外有很多相關的文章,我單純引述這篇 ZendAMF vs. AMFPHP 的文章做個簡單的翻譯吧。
- ZENDAMF 與 AMFPHP 的父親,也就是作者都是 Wade Arnold ,現在 Wade Arnold 幾乎把所有的時間都投入 ZENDAMF 的開發。
- 我喜歡那種自定義類別檔的使用方式。*不過我不知道為什麼,因為我覺得比較麻煩,反而AMFPHP那樣寫法簡單多了,ZENDAMF 光設定都研究一番了。
- ZENDAMF 是 ZEND FRAMEWORK 的一部份,是個整合過的 FRAMEWORK。
- 當學會之後非常容易設定,並且他是使用 PHP5 ,就跟 ZEND FRAMEWORK 是相同的。
- 最後 Adobe 全力支援,聽起來當然讚囉!
好吧,我終於知道我的英文能力很爛了,ANYWAY,ZENDAMF 挾著 ADOBE 原廠的支援浩浩蕩蕩的走來,更有相關的文章提到 ZENDAMF 是原生的C語言做轉譯,所以速度相較之下比較快,當然我著墨不深,還沒有辦法評論,但是就我個人認為 ZEND 是一家有能力 SUPPORT 的公司,雖然 AMFPHP 與 ZENDAMF 都是免費,ZENDAMF 還可以在你真的出問題的時候請求公司支援,但是台灣使用人較少,可能還需要大家的分享,希望大家一起努力。
廢話不多說,這次一樣跟著我們 STEP BY STEP 讓我們的 FLEX 跟 ZF PHP 搭上線吧
STEP 1 : 下載 ZF 1.7.6
首先我們到官方網站 http://framework.zend.com/ 下載最新版的 ZEND FRAME 內部及包括了 ZENDAMF 了。
SETP 2 : 開啟 FLEX 專案,並設定 SERVER 位置
接下來我們開啟一個新的 FLEX 專案,並且將我們後端設定為 PHP ,並且將輸出資料夾設定到我們的 WEB ROOT 路徑,我是使用 XAMPP 並且放置於 C:\ ,這邊請依照你的放置位置來設定。
接下來向 AMFPHP 一樣,我們也必須要設定一個 service-config.xml 來指定我們的 endpoint 的位置在哪邊,因為我的 gateway.php 未來將會與 SWF 檔放在一起,所以我只有輸入 gateway.php
service-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service id="zend-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="zend"> <channels> <channel ref="zend-endpoint"/> </channels> <properties> <source>*</source> </properties> </destination> </service> </services> <channels> <channel-definition id="zend-endpoint" class="mx.messaging.channels.AMFChannel"> <endpoint uri="gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>當然,也不要忘記還要設定 compiler 的資料喔,請加上 –services service-config.xml 這行喔 !
STEP 3 : 將 ZF 放入我們的專案中導入
將剛剛下載回來的 ZF 壓縮檔解壓縮,並且將 library 放入我們的專案路徑
STEP 4 : 接下來我們開始經典程式 HELLO WORLD PHP
這邊與 AMFPHP 稍微不同的地方,AMFPHP 的 GateWay 是早早就被寫好等在那邊等你取用的,但是 ZFAMF 卻要你親手建立你的 Gateway ,不管如何,我們先來建立我們的 PHP Class ,並且都與未來 SWF 檔產生的位置相同的地方。
hellow.php
1 2 3 4 5 6 7 8 <?php class hellow { public function sayHello(){ //甚麼都不做,就回傳字串 return "i Love corAusir"; } } ?>接下來我們來打造我們的 Gateway.php 來建立 FLEX 與 PHP CLASS 溝通的橋梁。
gateway.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php //Basic Config error_reporting(E_ALL | E_STRICT); //設定Error Report的等級 date_default_timezone_set('Asia/Taipei'); //設定時區為台北 //Include path //比較需要注意的是這邊新增了一個 library 的 PATH 路徑,用來供 ZFAMF 的資料互相存取 define ('P_S', PATH_SEPARATOR); set_include_path('.' .P_S .'library' .P_S .'../application/models/' .P_S .get_include_path()); //載入 ZFAMF 類別檔 require_once 'library/Zend/Amf/Server.php'; //載入我們的 HELLOW 類別檔 require_once 'hellow.php'; //建立 ZENDAMF SERVER $server = new Zend_Amf_Server(); //著名我們這裡面有一個 CLASS 叫做 HELLOW $server->setClass("hellow"); //執行結果 echo( $server -> handle() ); ?>
STEP 5 : 最後快速建立 FLEX 程式測試一下吧
利用剛剛建立完專案產生的 MXML 檔案,快速修改一下測試我們的 ZFAMF 的結果吧。
ZendAMF.mxml
1 2 3 4 5 6 7 8 9 10 11 12 13<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" fontSize="16"> <mx:Script> <![CDATA[ private function getZendAMF():void{ this.ro.sayHello(); } ]]> </mx:Script> <mx:TextInput text="{this.ro.sayHello.lastResult}"/> <mx:Button label="按下後使用 RemoteObject 取回 ZendAMF 後端資料" click="getZendAMF()"/> <mx:RemoteObject id="ro" destination="zend" source="hellow"/> </mx:Application>
完成,如果你照著步驟做,應該可以得到以下的結果,點擊按鈕後,FLEX 向 gateway.php 索取 hellow class 內的 sayhellow 方法,並回傳 i Love corAusir 並且顯示在 textinput 內。
恭喜啦 ! 大功告成
關於 ZendAMF 的使用國內資料相當的少,我好像只有看到兩篇,在網海上漂來漂去的,看了一大堆關於 ZF 的國外網站,相當的暈,國內對於 ZF 的琢磨實在不多,但是也是發現幾個不錯的高手網站在這邊一起提供給大家參考。
- #define KNOWLEDGE FREE : http://nxforce.blogspot.com/
- 該網站有許多 FLASH 的進階資料,有興趣的可以看一下喔,作者對於 PHP 也琢磨蠻多
- 網站製作學習誌 : http://www.jaceju.net/blog/
- 該網站對於 PHP 與 FRAMEWORK 琢磨頗深,有許多寶貴的資料
Random Posts
Loading…
相關文章 :









成功啦!感覺好像很複雜的樣子~
不知星期一的課有沒有開成~
不會阿~ 跟 AMFPHP 只差在要自己寫 gateWay.php 而以阿
其他都一樣耶~~
不知道中文支持度怎麼樣
改天再來試試看
希望 ZEND 課程可以開的成功 -.-
感覺那一步路,我還需要更努力….梅老大,我也報名了唷!
多聽多看多學~
成功就在眼前
Ausir大
請問一下你這個部落格是wordpress還是自己架設的
最近真想轉換平台的說..ㄏ
原本使用的不能像上面一下顯示清晰的程式碼
跟載入swf檔
或是你有推薦更好的部落格呢?
希望交流交流…^^
補充…我自己有申請一個wordpress的帳號
但是要貼程式碼的功能是不是要裝外掛程式
不過不是自己架設的似乎沒提供外掛功能,冏
莫非真的要自己架一個站…??
@cloudfly
這個論壇是我自己架的,也是使用 WP 來架設
如果要顯示清晰的程式碼有很多 HIGHLINE 的外掛有很多
例如 COOLCODE 我這套是 WP-CODEBOX
如果你是申請免費的 WP-BSP 的話外掛要怎麼掛我就不是很清楚了耶
不過你倒是可以上傳 JS 與 CSS 檔案
再用引入的,或是”偷引用”人家的 JS檔 或是 CSS檔 (不是很好的行為)
不一定說要自己架一個部落格才可以使用外掛
用 BSP 的部落格也可以用其他的方法達成這些功能喔 !!
當然自己架的話除了方便之外,還可以快速的增加自己要的功能
長期下來,使用自己的網址與部落格是比較恰當的
有空歡迎多來逛逛喔 ^_^
哈..是阿..怕之後架好後,但我也畢業了..
就沒有長期的server可以使用,
你是用自己電腦or公司當server??
不過還是嘗試一下好了
wordpress外掛好多
lightbox外掛顯示的特效也很讚
值得一試..^^
@cloudfly
我是向虛擬主機商租用的 SERVER
其實你也可以租一個虛擬空間來寫一些東西
一來可以分享一些知識讓大家知道
也可以記錄一些自己查詢過的東西
下次不用又在網海上漂浮….
一年大約三千以內吧~
如果不想要有經濟壓力的話也可以用 BSP 的
只是如果真的用心經營 到時候可能會被網址給綁住
LIGHTBOX 外掛就是俗稱 燈箱 外掛
那個外掛不錯 可惜不支援 HTML 以及 SWF
所以我選用的這套叫做 shadowbox 他不但支援 IMG 還有
SWF 以及 HTML 都可以用所以非常推薦
你可以參考我這篇文章
WordPress安裝可撥放SWF的燈箱LightBox外掛
您好.我按照你的步骤,做下来,最后运行时,弹出这样的错误:
请指点一二
@lazarus
您好~
看這樣子應該是 PHP 那邊有點問題
但是因為你已經用 SWF 去拿了 不太知道錯誤在哪
所以建議您先在瀏覽器開啟那隻 gateway.php
例如 : http://localhost/gateway.php
如果正確無誤應該會出現
Zend Amf Endpoint
在頁面上
如果有錯誤~ 須要看您的錯誤訊息
非常感谢,己经找到源头.
是访问路径的问题.
非常感谢您的教程.期待更多的更好的文章.
@lazarus
不客氣~
另外如果要連接資料庫~ 照上面的步驟會用到 XAMPP
但是會發生錯誤
屆時請參考
FLEX on PHP , ZendAMF with ZendDB (XAMPP的逆襲)
昨天HelloWorld成功.
今天练习Flex+Zendamf+Mysql,果然没有成功.
mysql的result不能直接给Flex,我转成$Array传给Flex.
DataGrid.dataProvider=evt.result.lastResult;
DataGrid是空空的.
不知所以何.
@lazarus
如果你是接收 EVENT 來綁定 dataProvide 的話
不需要加上 lastResult
lastResult 用在 binding 資料才用
你改成
DataGrid.dataProvider=evt.result;
這樣試試看
如果還是空空的~
請開啟 DEBUG 模式看看到底回傳了甚麼東西
您好.我后来找了资料.这样解决了.
我传给flex的是Object.
$server = new Zend_Amf_Server();
$server->setClass(”HelloWorld”);//多了这样一句
echo($server->handle());
Flex那边多一个对应的ValueObject;
其实我是喜欢以Object的形式来传送的.
DataGrid.dataProvider = evt.Result as Arry;
@lazarus
解決的就好~
恭喜您了 ^^
你可以參考我的文章關於 ZENDAMF 可以綁定 VO 型態
這樣在寫的速度可以更快些
您好,我有參考您的作法試作了一下,但是失敗了…
http://dev.ilay.tw/flex/helloZF/helloZF.html
可以請教一下那個錯誤訊息是怎麼回事嗎?~感謝!
我看寫法應當是沒有問題
可是不知道你 PHP 那邊的內容
錯誤訊息內並沒有寫問題~
這是我php的內容:
gateway.php
addDirectory(dirname(__FILE__).’/services/’);
$response = $server->handle();
echo $response;
?>
helloZF.php
不知道這些有沒有用…
感謝您快速的回應!
阿 抱歉 留言的code不完整
http://dev.ilay.tw/flex/helloZF/phpcode.zip
請在第 10 行之後插入
//著名我們這裡面有一個 CLASS 叫做 HELLOW
$server->setClass(”hellowZF”);
再試試看
XD不行耶
您好,我試出來了,似乎是因為放class的目錄沒辦法被include進來,但是這樣丟一個新的class就得手動寫一次設定了
我成功了@@ 原來是 services裡面的php檔名開頭要大寫!
@ilay
有成功就好 ^_^
因為我之前也有遇過目錄 load 不進來的狀況
請問一下,如果library要放在www下與project同一階層的話,那麼set_include_path()要怎麼設定才好呢? 謝謝.
@urara
這個東西被我遺忘了好久~ 呵呵~
這下子我暈啦~
set_include_path()
應該是 ZENDFRAMEWORK 的位置吧
因為看您的範例是把library 放到project目錄中,這樣一來如果有別的project這樣路徑又要改了.所以想把library就放在www之下讓不同的project都可以存取.
參照您的程式碼:
define (’P_S’, PATH_SEPARATOR);
set_include_path(’.’ .P_S .’library’ .P_S .’../application/models/’ .P_S .get_include_path());
裡面的’library’不管是改成’../library’,’.library’,’./library’都不行.
甚至直接把’c:\wamp\www\library’加進去也是錯誤.
搞這個zendamf 我發現花最多時間的是在喬路徑的問題.
另一個問題是檔案編碼竟然也是問題來源之一.
以hello.php本來編碼為big-5.改成編碼utf-8後
就產生錯誤了.
錯誤的內容大概是 com.xk27.amf.AMFException:unsupported AMF version or data corrupted.(這是用Charle 看到的訊息).
@urara
你改成這樣看看
set_include_path(’../’ .P_S .’library’ .P_S .’../application/models/’ .P_S .get_include_path());
真的很麻煩呢~ 呵呵~ 因為這個寫法 我也是書上看來的 = =
我記得我第一次用的時候橋路徑也橋超久的
如果沒有用到 自訂 CLASS 還是用 AMFPHP 比較快 XD
至於你第二個問題 QQ 好像是你回傳的類別再 AMF 裡面沒有定益
我想請問要如何將值傳道php 我有參照”FLEX on PHP , use AMFPHP 中文 UTF-8 編碼的對話”
中的xml部分想是寫一個將表單的值傳到php 但是一直無法顯示
我的xml如下
php如下
public function sayhello($remoteObject){
$name = $remoteObject["name"];
$job = $remoteObject["job"];
return “你叫 『”.$name.”』,職業是『”.$job.”』”;
}
xml
抱歉 不會貼程式碼 我有參照 程式碼
但還是失敗