Как связать класс PHP DateTime с классом ActionScript / Flex Date с помощью Zend Framework AMF - PullRequest
6 голосов
/ 14 марта 2012

Фон

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

Я использую 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 ]

0 голосов
/ 29 марта 2012

По моему опыту, 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 отвечает на это.После того, как вы поиграете с этим достаточно, я уверен, что вы найдете виновника.

0 голосов
/ 21 февраля 2013

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

0 голосов
/ 23 марта 2012

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

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

Chris

...