2011-10-28 66 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