如何使用Zend Framework AMF将PHP DateTime类映射到ActionScript/Flex Dat



背景

好吧,我是那种从不提问的人,通常可以从现有的问题或论坛中找到我需要的东西。。。。但遗憾的是,在过去的几天里,我一直在努力弄清楚这一点,但现有的信息很少。

我使用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/

相关内容

  • 没有找到相关文章

最新更新