Сопоставление классов AMF не работает

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

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

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

<?php
namespace app\web;

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

   public $stuff1;

   public $stuff2;

}

Это класс сценария действия: 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. Что я делаю неправильно?


person F21    schedule 28.10.2011    source источник


Ответы (2)


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

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

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

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

public class StaticLinks
{
    private var request:Request;
}

Затем укажите это в моем приложении:

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

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

person Marty Pitt    schedule 28.10.2011
comment
Это было оно! Поиграв, я обнаружил, что класс будет типизирован, если я создам его экземпляр var testing:Request;! - person F21; 28.10.2011

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

import flash.net.registerClassAlias;

flash.net.registerClassAlias("com.site.remote.Request", Request);
person Jason Sturges    schedule 28.10.2011
comment
Из того, что я прочитал (roboncode.com/articles/144) и других сообщений в блогах, registerClassAlias не обязательно, если я использую гибкую структуру, но я могу ошибаться. В то время как объекты возвращаются с типом Request, если я использую registerClassAlias, странно то, что если я устанавливаю flash.net.registerClassAlias("asdfsomegibberish", Request);, объект все равно возвращается с типом запроса. - person F21; 28.10.2011