Как сопоставить класс PHP DateTime классу ActionScript / Flex Date с помощью Zend Framework AMF

Фон

Хорошо, я один из тех парней, которые НИКОГДА не задают вопросы и которые обычно могут найти то, что мне нужно, из существующих вопросов или форумов.... но, увы, я провел последние несколько дней, пытаясь выяснить это, и придумал очень мало существующей информации.

Я использую Flash Builder 4.6 для PHP Premium для создания приложения Flex, использующего возможности AMF PHP Zend Frameworks для отображения классов из PHP в Flex и использования их в качестве объектов для отправки туда и обратно вместо использования XML или JSON. Прямо сейчас я делаю все это на одной локальной машине для удобства.

вопрос

У меня нет проблем с отображением моих собственных пользовательских классов PHP в классы ActionScript/Flex, но я не могу на протяжении всей жизни отобразить DateTime PHP-класс в ActionScript Date учебный класс. Я читал в другом месте, что он автоматически отображает DateTime возражает против Date объекты, но я никогда не заставлял его работать.

Странно, однако, я могу заставить его работать, если я заменю все экземпляры, в моем случае, valueObjects.DateTime (автоматически сгенерированный класс ActionScript) для Date в _Super_Foo.as класс, который имеет DateTime имущество. Это в основном заставляет Flex интерпретировать данные этого свойства как Date, Тем не менее, так как все _Super_XXX.as файлы - это файлы, автоматически сгенерированные Flex, они переписываются каждый раз, когда я обновляю или редактирую ЛЮБОЙ PHP-сервис, на который Flex ссылается в Flash Builder.

замечания

Конечно, я мог бы сделать это быстрым и грязным способом, сохранив переменную в виде строки (она поступает из 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
    

    Мне просто нужно сделать это автоматически, как я прочитал.

3 ответа

AmfPHP автоматически отображает его. http://www.silexlabs.org/amfphp/

Что ж, я должен признать, что я обычно использую BlazeDS на Java, а не на Zend, но у меня были похожие проблемы при передаче объектов Calendar (я хотел предотвратить потерю данных о часовых поясах). Для этого BlazeDS поддерживает так называемые PropertyProxys, которые являются компонентами, которые позволяют перенять процесс сериализации / десериализации для определенных типов.

Я предположил бы, что ZEND поддержит подобное. Таким образом, другой вариант - сделать Zend zupport полным типом Flex. Я немного искал, и кажется, что вся терминология отличается в Zend, но я думаю, что эта статья stackru должна объяснить это немного: пользовательский диспетчер Zend AMF

Крис

По моему опыту, Zend Framework научил меня, что он предлагает множество функций, но часто они не работают так, как вы ожидаете. Например:

Недавно я работал с ошибкой в ​​"digitalus-cms" (блог-фреймворке, построенном поверх ZF), из-за которого не могло быть опубликовано новых статей с дефисом в названии. Я отследил его до Zend_Form_Element::filterName. Он использует регулярное выражение, которое соответствует любому символу, который попадает в категорию: [^a-zA-Z0-9_\x7f-\xff], а затем удаляет его. Это приводит к удалению дефисов из имен элементов формы, которые и являются причиной ошибки.

Если Zend_Amf или Zend_Date не работают так, как вы этого хотите, найдите обходной путь, такой как передача номера метки времени Unix, чтобы все работало так, как должно. Затем вы можете написать класс для расширения одного из классов Zend. Zend Framework предназначен для расширения, именно так была построена среда, так что вы можете самостоятельно решать подобные проблемы, чтобы заставить среду работать так, как вы хотите. Вот и весь смысл фантиков. Давайте создадим несколько ваших собственных классов-оболочек и добавим некоторые методы для взаимодействия с ZF, чтобы вы могли точно настроить все.

Что касается поиска причины вашей проблемы, все, что я могу вам сказать, это продолжать отладку и изоляцию кода, чтобы вы знали, что вы передаете flex, и как flex отвечает на это. После того, как вы поиграете с этим достаточно, я уверен, что вы найдете виновника.

Другие вопросы по тегам