#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);
, объект все равно возвращается напечатанным как запрос.