2011-10-28 68 views
1

我正在構建一個使用Flex 4.5和Zend_AMF作爲我的AMF端點的應用程序。AMF類映射不起作用

我想將一個名爲CRequest的類映射到一個名爲Request in Flex的類中。

這是我的PHP類:

<?php 
namespace app\web; 

class CRequest{ 
    public $_explicitType = 'com.site.remote.Request'; 

    public $stuff1; 

    public $stuff2; 

} 

這是ActionScript類:com.site.remote.Request

package com.dreamatique.remoting 
{ 
    [Bindable] 
    [RemoteClass(alias="com.site.remote.Request")] 
    public class Request 
    { 

     public var stuff1:String; 

     public var stuff2:String; 

     public function Request() 
     { 
     } 
    } 
} 

作爲一個測試,我做了終點返回的實例CRequest來自PHP端,不管請求是什麼。

我然後產生一個遠程對象調用是這樣的:

var remoteObject:RemoteObject = new RemoteObject(); 
remoteObject.endpoint = "http://localhost/to/my/amf/endpoint"; 
remoteObject.showBusyCursor = true; 
remoteObject.source = 'testing'; 
var op:AbstractOperation = remoteObject.getOperation(null); 
op.addEventListener(ResultEvent.RESULT, result); 
op.send(); 

public static function result(event:ResultEvent):void{ 

    trace(event.result); 
    trace(Class(getDefinitionByName(getQualifiedClassName(event.result)))); 
    Alert.show(event.result.toString()); 

} 

的問題是,結果返回類型爲ObjectProxy,而不是Request。我究竟做錯了什麼?

回答

2

確保您至少有一個對您的代碼庫中某個類的引用。

這是一個常見的陷阱,尤其是在首次開發遠程調用時,以及在任何地方的任何代碼中實際使用該類型之前。

如果該類未被引用,則不會被編譯進去,因此不會被註冊。

通常情況下,早期發育過程中,我將最終創建一個StaticLinker類:

public class StaticLinks 
{ 
    private var request:Request; 
} 

然後在我的應用程序中引用這一點:

<s:Script> 
    var linker:StaticLinks; 
</s:Script> 

順便說一句 - 你在你早期正確假設:如果您已將課程註釋爲[RemoteObject],則無需致電registerClass()

+0

就是這樣!玩過之後,我發現如果我創建了一個實例'var testing:Request;'! – F21

1

你還記得上課嗎?

import flash.net.registerClassAlias; 

flash.net.registerClassAlias("com.site.remote.Request", Request); 
+0

從我讀過的(http://www.roboncode.com/articles/144)和其他博客文章中,如果我使用flex框架,「registerClassAlias」不是必需的,但我可能是錯的。如果我使用'registerClassAlias',則返回對象的類型爲'Request',奇怪的是,如果我設置了'flash.net.registerClassAlias(「asdfsomegibberish」,Request);'對象仍然返回輸入請求。 – F21