我已经为 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
这一切仍在进行中,因此任何 cmets/改进将不胜感激。当您遇到这些库的问题时,只需将它们记录在 github 上,它们就会得到及时解决。
最后是关于序列化嵌入文档和引用文档的说明 - 嵌入文档应该与它们的父文档一起序列化,而引用文档不应该。这反映了数据在数据库中的保存方式。这也意味着循环引用不是问题。
更新
我已将更新推送到 Sds/DoctrineExtensions/Serializer,以便它现在可以正确处理引用。以下三(五)种方法已更新:
toArray/toJson
fromArray/fromJson
applySerializeMetadataToArray
前两个是自我解释 - 最后一个是允许应用序列化规则,而不必将数据库结果水合到文档中。
默认情况下,引用将被序列化为这样的数组:
[$ref: 'CollectionName/DocumentId']
$ref 引用风格是 Mongo 内部使用的,所以它看起来很合适。给出引用的格式,期望它可以用作 REST API 的 URL。
可以通过定义替代ReferenceSerializer 来覆盖默认行为,如下所示:
/**
* @ODM\ReferenceMany(targetDocument="MyTargetDocument")
* @Sds\Serializer(@Sds\ReferenceSerializer('MyAlternativeSerializer'))
*/
protected $myDocumentProperty;
lib 中已包含一个备用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 注释支持继承和覆盖,因此它们可以很好地处理复杂的文档结构。