Отображение классов AMF не работает

#apache-flex #object #types #amfphp #zend-amf

#apache-flex #объект #типы #amfphp #zend-amf

Вопрос:

Я создаю приложение, используя Flex 4.5 и Zend_AMF в качестве конечной точки AMF.

Я хотел бы сопоставить класс с именем CRequest в PHP с классом с именем Request в Flex.

Это мой класс php:

 <?php
namespace appweb;

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

   public $stuff1;

   public $stuff2;

}
 

Это класс actionscript: com.site.remote.Запрос

 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());

}
 

Проблема в том, что результат возвращается с типом as ObjectProxy и not Request . Что я делаю не так?

Ответ №1:

Убедитесь, что у вас есть хотя бы одна ссылка на класс где-нибудь в вашей кодовой базе.

Это распространенная ловушка, особенно при первой разработке удаленного вызова и до того, как вы фактически использовали тип в любом коде где угодно.

Если на класс нет ссылки, он не компилируется и, следовательно, не регистрируется.

Часто на ранних этапах разработки я заканчиваю созданием StaticLinker класса:

 public class StaticLinks
{
    private var request:Request;
}
 

Затем ссылайтесь на это в моем приложении:

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

Кстати, вы правы в своем предыдущем предположении: если вы аннотировали класс как a [RemoteObject] , вам не требуется вызывать registerClass() .

Комментарии:

1. Это было оно! Поиграв, я обнаружил, что класс будет введен, если я создам его экземпляр var testing:Request; !

Ответ №2:

Вы не забыли зарегистрировать класс?

 import flash.net.registerClassAlias;

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

Комментарии:

1. Из того , что я прочитал ( roboncode.com/articles/144 ) и другие сообщения в блоге, registerClassAlias не обязательно, если я использую фреймворк flex, но я могу ошибаться. В то время как объекты возвращаются напечатанными так, как Request если бы я их использовал registerClassAlias , странно то, что если я устанавливаю flash.net.registerClassAlias("asdfsomegibberish", Request); , объект все равно возвращается напечатанным как запрос.