У меня уже есть сериализатор, написанный для DoctrineODM. Вы можете найти его в http://github.com/superdweebie/DoctrineExtensions — посмотрите в lib/Sds/DoctrineExtensions/Serializer
.
Если вы используете zf2, вам также может понравиться http://github.com/superdweebie/DoctrineExtensionsModule. , который настраивает DoctrineExtensions для использования в zf2.
Чтобы использовать модуль, установите его с помощью composer, как и любой другой модуль. Затем добавьте следующее в конфигурацию zf2:
'sds' => [
'doctrineExtensions' => [
'extensionConfigs' => [
'Sds\DoctrineExtensions\Serializer' => null,
),
),
),
Чтобы получить сериализатор, используйте:
$serializer = $serivceLocator->get('Sds\DoctrineExtensions\Serializer');
Чтобы использовать сериализатор:
$array = $serializer->toArray($document)
$json = $serializer->toJson($document)
$document = $serializer->fromArray($array)
$document = $serializer->fromJson($json)
Есть также несколько дополнительных аннотаций для управления сериализацией, если вы хотите их использовать:
@Sds\Setter - specify a non standard setter for a property
@Sds\Getter - specify a non standard getter fora property
@Sds\Serializer(@Sds\Ignore) - ignore a property when serializing
Это все еще в стадии разработки, поэтому любые комментарии/улучшения будут высоко оценены. Если у вас возникнут проблемы с этими библиотеками, просто зарегистрируйте их на github, и они будут оперативно решены.
Наконец, примечание о сериализации встроенных документов и документов, на которые ссылаются, — встроенные документы должны быть сериализованы вместе с их родителем, а документы, на которые есть ссылки, — нет. Это отражает способ сохранения данных в БД. Это также означает, что циклические ссылки не являются проблемой.
Обновлять
Я отправил обновления в Sds/DoctrineExtensions/Serializer, чтобы теперь он мог правильно обрабатывать ссылки. Обновлены следующие три (пять) методов:
toArray/toJson
fromArray/fromJson
applySerializeMetadataToArray
Первые два не требуют пояснений, а последний позволяет применять правила сериализации без необходимости переноса результатов из базы данных в документы.
По умолчанию ссылки будут сериализованы в такой массив:
[$ref: 'CollectionName/DocumentId']
Стиль ссылок $ref
— это то, что Mongo использует внутри, поэтому он кажется подходящим. Формат ссылки дан с расчетом на то, что ее можно будет использовать в качестве URL-адреса REST API.
Поведение по умолчанию можно переопределить, определив альтернативу ReferenceSerializer
следующим образом:
/**
* @ODM\ReferenceMany(targetDocument="MyTargetDocument")
* @Sds\Serializer(@Sds\ReferenceSerializer('MyAlternativeSerializer'))
*/
protected $myDocumentProperty;
Один альтернативный ReferenceSerializer
уже включен в библиотеку. Это энергичный сериализатор — он будет сериализовать ссылки, как если бы они были встроенными документами. Его можно использовать следующим образом:
/**
* @ODM\ReferenceMany(targetDocument="MyTargetDocument")
* @Sds\Serializer(@Sds\ReferenceSerializer('Sds\DoctrineExtensions\Serializer\Reference\Eager'))
*/
protected $myDocumentProperty;
Или предоставляется альтернативная сокращенная аннотация:
/**
* @ODM\ReferenceMany(targetDocument="MyTargetDocument")
* @Sds\Serializer(@Sds\Eager))
*/
protected $myDocumentProperty;
Альтернативный вариант ReferenceSerializers
должен реализовать Sds\DoctrineExtensions\Serializer\Reference\ReferenceSerializerInterface
Кроме того, я убрал аннотацию игнорирования, поэтому к свойствам можно добавить следующие аннотации, чтобы обеспечить более точное управление сериализацией:
@Sds\Serializer(@Sds\Ignore('ignore_when_serializing'))
@Sds\Serializer(@Sds\Ignore('ignore_when_unserializing'))
@Sds\Serializer(@Sds\Ignore('ignore_always'))
@Sds\Serializer(@Sds\Ignore('ignore_never'))
Например, поместите @Sds\Serializer(@Sds\Ignore('ignore_when_serializing'))
в свойство электронной почты — это означает, что электронная почта может быть отправлена на сервер для обновления, но никогда не может быть сериализована для клиента в целях безопасности.
И, наконец, если вы еще не заметили, аннотации sds поддерживают наследование и переопределение, поэтому они хорошо работают со сложными структурами документов.
person
superdweebie
schedule
06.12.2012