首頁 > FLEX, PHP, 程式設計, 網頁設計 > FLEX on PHP , 使用 ZendAMF remoteObject

FLEX on PHP , 使用 ZendAMF remoteObject

2009年3月12日  瀏覽次數 : 8,019

ZendAMF 好熟悉的名字,上次詳盡的介紹過 AMFPHP 與 FLEX 之間的互動後,怎麼又跑出 ZendAMF 呢 ? ,而且也是 AMF ,那 Zend 又是甚麼東西 ? 原來 ZEND 是一家公司,所開發的東西有許多,包含 Zend Optimizer 或是 IDE 工具 Zend Studio ,當然還又更膾炙人口的 Zend Framework ,沒錯 ! ZendAMF 就是屬於 Zend Framework 的功能,並且這項功能是由 Adobe 官方協同發展喔。

image 圖片:Adobe 與 PHP 的合作,使用 ZF with AMF 來開發你下一個 RIA 吧 !

image

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  的文章做個簡單的翻譯吧。

  1. ZENDAMF 與 AMFPHP 的父親,也就是作者都是 Wade Arnold ,現在 Wade Arnold 幾乎把所有的時間都投入 ZENDAMF 的開發。
  2. 我喜歡那種自定義類別檔的使用方式。*不過我不知道為什麼,因為我覺得比較麻煩,反而AMFPHP那樣寫法簡單多了,ZENDAMF 光設定都研究一番了。
  3. ZENDAMF 是 ZEND FRAMEWORK 的一部份,是個整合過的 FRAMEWORK。
  4. 當學會之後非常容易設定,並且他是使用 PHP5 ,就跟 ZEND FRAMEWORK 是相同的。
  5. 最後 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 了。

image 

SETP 2 : 開啟 FLEX 專案,並設定 SERVER 位置

接下來我們開啟一個新的 FLEX 專案,並且將我們後端設定為 PHP ,並且將輸出資料夾設定到我們的 WEB ROOT 路徑,我是使用 XAMPP 並且放置於 C:\ ,這邊請依照你的放置位置來設定。

image

接下來向 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>

image

當然,也不要忘記還要設定 compiler 的資料喔,請加上 –services service-config.xml 這行喔 !

image

STEP 3 : 將 ZF 放入我們的專案中導入

將剛剛下載回來的 ZF 壓縮檔解壓縮,並且將 library 放入我們的專案路徑

image 

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 內。

image

恭喜啦 ! 大功告成

關於 ZendAMF 的使用國內資料相當的少,我好像只有看到兩篇,在網海上漂來漂去的,看了一大堆關於 ZF 的國外網站,相當的暈,國內對於 ZF 的琢磨實在不多,但是也是發現幾個不錯的高手網站在這邊一起提供給大家參考。

    • #define KNOWLEDGE FREE : http://nxforce.blogspot.com/
    • 該網站有許多 FLASH 的進階資料,有興趣的可以看一下喔,作者對於 PHP 也琢磨蠻多
    • 網站製作學習誌 : http://www.jaceju.net/blog/
    • 該網站對於 PHP 與 FRAMEWORK 琢磨頗深,有許多寶貴的資料

Random Posts

Loading…

:: 把這篇好文推到書籤網站與更多人分享吧 ::
  • funp
  • Hemidemi
  • YahooKimo
  • Google
  • udn
  • Haohao
  • Live

相關文章 :

Ausir FLEX, PHP, 程式設計, 網頁設計 , , , , , , , , ,

  1. 2009年3月12日23:45 | #1

    成功啦!感覺好像很複雜的樣子~
    不知星期一的課有沒有開成~

  2. 2009年3月12日23:50 | #2

    不會阿~ 跟 AMFPHP 只差在要自己寫 gateWay.php 而以阿

    其他都一樣耶~~
    不知道中文支持度怎麼樣
    改天再來試試看

    希望 ZEND 課程可以開的成功 -.-

  3. 2009年3月12日23:56 | #3

    感覺那一步路,我還需要更努力….梅老大,我也報名了唷!

  4. 2009年3月13日00:58 | #4

    多聽多看多學~

    成功就在眼前

  5. cloudfly
    2009年3月14日23:47 | #5

    Ausir大

    請問一下你這個部落格是wordpress還是自己架設的

    最近真想轉換平台的說..ㄏ

    原本使用的不能像上面一下顯示清晰的程式碼

    跟載入swf檔

    或是你有推薦更好的部落格呢?

    希望交流交流…^^

  6. cloudfly
    2009年3月14日23:50 | #6

    補充…我自己有申請一個wordpress的帳號
    但是要貼程式碼的功能是不是要裝外掛程式
    不過不是自己架設的似乎沒提供外掛功能,冏
    莫非真的要自己架一個站…??

  7. 2009年3月15日01:39 | #7

    @cloudfly
    這個論壇是我自己架的,也是使用 WP 來架設
    如果要顯示清晰的程式碼有很多 HIGHLINE 的外掛有很多
    例如 COOLCODE 我這套是 WP-CODEBOX
    如果你是申請免費的 WP-BSP 的話外掛要怎麼掛我就不是很清楚了耶

    不過你倒是可以上傳 JS 與 CSS 檔案
    再用引入的,或是”偷引用”人家的 JS檔 或是 CSS檔 (不是很好的行為)

    不一定說要自己架一個部落格才可以使用外掛
    用 BSP 的部落格也可以用其他的方法達成這些功能喔 !!

    當然自己架的話除了方便之外,還可以快速的增加自己要的功能
    長期下來,使用自己的網址與部落格是比較恰當的

    有空歡迎多來逛逛喔 ^_^

  8. cloudfly
    2009年3月15日03:22 | #8

    哈..是阿..怕之後架好後,但我也畢業了..
    就沒有長期的server可以使用,
    你是用自己電腦or公司當server??

    不過還是嘗試一下好了
    wordpress外掛好多
    lightbox外掛顯示的特效也很讚
    值得一試..^^

  9. 2009年3月15日03:52 | #9

    @cloudfly

    我是向虛擬主機商租用的 SERVER
    其實你也可以租一個虛擬空間來寫一些東西

    一來可以分享一些知識讓大家知道
    也可以記錄一些自己查詢過的東西
    下次不用又在網海上漂浮….

    一年大約三千以內吧~
    如果不想要有經濟壓力的話也可以用 BSP 的
    只是如果真的用心經營 到時候可能會被網址給綁住

    LIGHTBOX 外掛就是俗稱 燈箱 外掛
    那個外掛不錯 可惜不支援 HTML 以及 SWF
    所以我選用的這套叫做 shadowbox 他不但支援 IMG 還有
    SWF 以及 HTML 都可以用所以非常推薦

    你可以參考我這篇文章

    WordPress安裝可撥放SWF的燈箱LightBox外掛

  10. lazarus
    2009年3月18日22:34 | #10

    您好.我按照你的步骤,做下来,最后运行时,弹出这样的错误:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    ArgumentError: Error #2004: 某个参数无效。  url: 'http:gateway.php'
    	at flash.net::NetConnection/connect()
    	at mx.messaging.channels::NetConnectionChannel/internalConnect()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:216]
    	at mx.messaging.channels::AMFChannel/internalConnect()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel.as:264]
    	at mx.messaging::Channel/connect()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\Channel.as:756]
    	at mx.messaging::ChannelSet/connectChannel()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:1325]
    	at mx.messaging::ChannelSet/reconnectChannel()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:1435]
    	at flash.utils::Timer/_timerDispatch()
    	at flash.utils::Timer/tick()

    请指点一二

  11. 2009年3月18日23:13 | #11

    @lazarus
    您好~

    看這樣子應該是 PHP 那邊有點問題
    但是因為你已經用 SWF 去拿了 不太知道錯誤在哪
    所以建議您先在瀏覽器開啟那隻 gateway.php
    例如 : http://localhost/gateway.php

    如果正確無誤應該會出現
    Zend Amf Endpoint

    在頁面上

    如果有錯誤~ 須要看您的錯誤訊息

  12. lazarus
    2009年3月19日01:16 | #12

    非常感谢,己经找到源头.
    是访问路径的问题.

    非常感谢您的教程.期待更多的更好的文章.

  13. 2009年3月19日02:08 | #13

    @lazarus

    不客氣~

    另外如果要連接資料庫~ 照上面的步驟會用到 XAMPP
    但是會發生錯誤
    屆時請參考

    FLEX on PHP , ZendAMF with ZendDB (XAMPP的逆襲)

  14. lazarus
    2009年3月19日21:06 | #14

    昨天HelloWorld成功.
    今天练习Flex+Zendamf+Mysql,果然没有成功.

    mysql的result不能直接给Flex,我转成$Array传给Flex.
    DataGrid.dataProvider=evt.result.lastResult;

    DataGrid是空空的.
    不知所以何.

  15. 2009年3月19日21:09 | #15

    @lazarus

    如果你是接收 EVENT 來綁定 dataProvide 的話
    不需要加上 lastResult
    lastResult 用在 binding 資料才用

    你改成
    DataGrid.dataProvider=evt.result;
    這樣試試看

    如果還是空空的~
    請開啟 DEBUG 模式看看到底回傳了甚麼東西

  16. lazarus
    2009年3月23日13:17 | #16

    您好.我后来找了资料.这样解决了.
    我传给flex的是Object.
    $server = new Zend_Amf_Server();
    $server->setClass(”HelloWorld”);//多了这样一句
    echo($server->handle());

    Flex那边多一个对应的ValueObject;
    其实我是喜欢以Object的形式来传送的.

    DataGrid.dataProvider = evt.Result as Arry;

  17. 2009年3月23日13:42 | #17

    @lazarus

    解決的就好~

    恭喜您了 ^^

    你可以參考我的文章關於 ZENDAMF 可以綁定 VO 型態
    這樣在寫的速度可以更快些

  18. ilay
    2009年8月22日13:51 | #18

    您好,我有參考您的作法試作了一下,但是失敗了…
    http://dev.ilay.tw/flex/helloZF/helloZF.html
    可以請教一下那個錯誤訊息是怎麼回事嗎?~感謝!

  19. 2009年8月22日14:08 | #19

    我看寫法應當是沒有問題
    可是不知道你 PHP 那邊的內容
    錯誤訊息內並沒有寫問題~

  20. ilay
    2009年8月22日14:13 | #20

    這是我php的內容:
    gateway.php
    addDirectory(dirname(__FILE__).’/services/’);
    $response = $server->handle();
    echo $response;
    ?>
    helloZF.php

    不知道這些有沒有用…
    感謝您快速的回應!

  21. ilay
    2009年8月22日14:15 | #21

    阿 抱歉 留言的code不完整
    http://dev.ilay.tw/flex/helloZF/phpcode.zip

  22. 2009年8月22日15:30 | #22

    請在第 10 行之後插入

    //著名我們這裡面有一個 CLASS 叫做 HELLOW
    $server->setClass(”hellowZF”);

    再試試看

  23. ilay
    2009年8月22日16:14 | #23

    XD不行耶

  24. ilay
    2009年8月22日20:02 | #24

    您好,我試出來了,似乎是因為放class的目錄沒辦法被include進來,但是這樣丟一個新的class就得手動寫一次設定了

  25. ilay
    2009年8月22日22:07 | #25

    我成功了@@ 原來是 services裡面的php檔名開頭要大寫!

  26. 2009年8月23日01:58 | #26

    @ilay

    有成功就好 ^_^
    因為我之前也有遇過目錄 load 不進來的狀況

  27. urara
    2009年9月10日16:55 | #27

    請問一下,如果library要放在www下與project同一階層的話,那麼set_include_path()要怎麼設定才好呢? 謝謝.

  28. 2009年9月10日17:30 | #28

    @urara

    這個東西被我遺忘了好久~ 呵呵~
    這下子我暈啦~

    set_include_path()
    應該是 ZENDFRAMEWORK 的位置吧

  29. urara
    2009年9月10日20:53 | #29

    Ausir :
    @urara
    這個東西被我遺忘了好久~ 呵呵~
    這下子我暈啦~
    set_include_path()
    應該是 ZENDFRAMEWORK 的位置吧

    Ausir :
    @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 看到的訊息).

  30. 2009年9月11日11:47 | #30

    @urara

    你改成這樣看看

    set_include_path(’../’ .P_S .’library’ .P_S .’../application/models/’ .P_S .get_include_path());

    真的很麻煩呢~ 呵呵~ 因為這個寫法 我也是書上看來的 = =
    我記得我第一次用的時候橋路徑也橋超久的

    如果沒有用到 自訂 CLASS 還是用 AMFPHP 比較快 XD

    至於你第二個問題 QQ 好像是你回傳的類別再 AMF 裡面沒有定益

  31. 抓梗
    2010年9月22日17:30 | #31

    我想請問要如何將值傳道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.”』”;
    }

  32. 抓梗
    2010年9月22日17:33 | #32

    xml

  33. 抓梗
    2010年9月22日17:35 | #33

  34. 抓梗
    2010年9月22日17:36 | #34

    抱歉 不會貼程式碼 我有參照 程式碼
    但還是失敗

  1. 本篇文章目前尚無任何 trackbacks 和 pingbacks。