7

背景

好吧,我是那些从不提问的人之一,他们通常可以从现有的问题或论坛中找到我需要的东西....但是,过去几天我一直在试图解决这个问题并提出了非常现有资料很少。

我正在使用 Flash Builder 4.6 for PHP Premium 构建一个 Flex 应用程序,该应用程序使用 PHP Zend Frameworks 的 AMF 功能将类从 PHP 映射到 Flex,并将它们用作来回发送的对象,而不是使用 XML 或 JSON。现在,为了方便起见,我正在一台本地机器上完成所有操作。

问题

我没有遇到将我自己的自定义 PHP 类映射到 ActionScript/Flex 类的问题,但我终其一生都无法将DateTimePHP 类映射到 ActionScriptDate类。我在其他地方读到它会自动将对象映射DateTimeDate对象,但我从来没有让它工作。

valueObjects.DateTime奇怪的是,如果我将所有实例(在我的情况下,自动生成的 ActionScript 类)替换为具有该属性Date的类中,我可以让它工作。这基本上迫使 Flex 将该属性的数据解释为. 但是,由于所有文件都是 Flex 自动生成的文件,因此每当我在 Flash Builder 中刷新或编辑 Flex 链接到的任何 PHP 服务时,它都会被重写。_Super_Foo.asDateTimeDate_Super_XXX.as

评论

我当然可以通过将变量保留为字符串(它来自 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
    

    我只需要它像我读过的那样自动执行此操作。

4

3 回答 3

0

根据我的经验,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 是如何响应的。在你玩够了之后,我相信你会找到罪魁祸首。

于 2012-03-29T17:59:33.370 回答
0

好吧,我不得不承认,我通常在 Java 上使用 BlazeDS 而不是 Zend,但是在传输 Calendar 对象时我遇到了类似的问题(我想防止丢失时区数据)。对于此 BlazeDS 支持所谓的 PropertyProxys,它们是允许接管某些类型的序列化/反序列化过程的组件。

我会假设 ZEND 会支持类似的事情。所以另一个选择实际上是让 Zend zsupport 成为完整的 Flex 类型。我搜索了一下,似乎整个术语在 Zend 中有所不同,但我认为这篇 stackoverflow 文章应该稍微解释一下:Zend AMF custom dispatcher

克里斯

于 2012-03-23T07:26:41.083 回答
0

AmfPHP 会自动映射它。http://www.silexlabs.org/amfphp/

于 2013-02-21T10:50:56.720 回答