背景
好吧,我是那种从不提问的人,通常可以从现有的问题或论坛中找到我需要的东西。。。。但遗憾的是,在过去的几天里,我一直在努力弄清楚这一点,但现有的信息很少。
我使用Flash Builder 4.6 for PHP Premium来构建一个Flex应用程序,该应用程序使用PHP Zend Frameworks的AMF功能将类从PHP映射到Flex,并将它们用作来回发送的对象,而不是使用XML或JSON。现在我在一台本地机器上轻松地完成这一切。
问题
我没有遇到将自己的自定义PHP类映射到ActionScript/Flex类的问题,但我一辈子都无法将DateTime
PHP类映射为ActionScriptDate
类。我在其他地方读到它会自动将DateTime
对象映射到Date
对象,但我从未让它工作过。
然而,奇怪的是,如果我在具有DateTime
属性的_Super_Foo.as
类中将valueObjects.DateTime
(自动生成的ActionScript类)的所有实例替换为Date
,我就可以让它工作起来。这基本上迫使Flex将该属性的数据解释为Date
。然而,由于所有_Super_XXX.as
文件都是Flex自动生成的文件,所以每当我在Flash Builder中刷新或编辑Flex链接到的任何PHP服务时,它都会被重写。
备注
当然,我可以通过将变量保持为字符串(它来自MySQL的DateTime字段),然后创建一些函数将其转换为客户端的Date
对象来快速而肮脏地完成这项工作,但我需要一个更永久、更稳定的解决方案。
示例:
<?php
class Foo {
public $id; // int
public $name; // string
public $date; // DateTime
public $bar; // custom object
}
?>
应该转到--->
package {
class Foo {
public var id:int;
public var name:String;
public var date:Date; // native class
public var bar:Bar;
}
}
但是我得到
package {
class Foo {
public var id:int;
public var name:String;
public var date:DateTime; // custom class
public var bar:Bar;
}
}
我尝试过以下内容:
在gateway.php文件中
$server->setClassMap("Date", "DateTime");
使用Zend_Date对象而不是
$foo->date = new Zend_Date($blah);
并且在尝试明确地映射之后
$server->setClassMap("Date", "Zend_Date");
我目前在_Super_Foo.as文件中进行的更改(该文件经常被重写)
private var _internal_date : valueObjects.DateTime; // custom object
至
private var _internal_date : Date; // native object
我只需要它自动完成这件事,就像我读过它应该做的那样。
我不得不承认,我通常在Java上使用BlazeDS,而不是Zend,但我在传输日历对象时也遇到过类似的问题(我想防止丢失时区数据)。为此,BlazeDS支持所谓的PropertyProxys,这些组件允许接管某些类型的序列化/反序列化过程。
我认为ZEND会支持类似的事情。因此,另一种选择实际上是让Zend-zupport成为完整的Flex类型。我搜索了一点,在Zend中,整个术语似乎有所不同,但我认为这篇stackoverflow文章应该对其进行一点解释:Zend AMF自定义调度器
Chris
根据我的经验,Zend Framework教会了我,它提供了许多功能,但很多时候它们并不像你期望的那样工作。例如:
最近,我在"digitalus cms"(一个建立在ZF之上的类似博客的框架)中遇到了一个错误,它无法在标题名称中使用连字符发布新文章。我追踪到Zend_Form_Element::filterName。它使用一个正则表达式来匹配属于以下类别的任何字符:[^a-zA-Z0-9_\x7f-\xff],然后将其删除。这最终会从表单元素的名称中删除连字符,而这些连字符最终会导致错误。
如果Zend_Amf或Zend_Date不能按您希望的方式工作,请找到一个变通方法,例如传递一个unix时间戳编号,以便一切正常工作。然后,您可以编写一个类来扩展Zend的一个类。Zend框架是用来扩展的,这就是框架的构建方式,这样你就可以自己解决这些问题,让框架按照你想要的方式运行。这就是包装器的全部意义。继续,创建一些自己的包装器类,并引入一些方法与ZF交互,这样您就可以对所有内容进行微调。
至于找到问题的原因,我所能告诉你的就是继续调试和隔离代码,这样你就知道你在传递什么flex,以及flex是如何响应的。等你玩够了,我相信你会找到罪魁祸首的。
AmfHP会自动对其进行映射。http://www.silexlabs.org/amfphp/