我有一個已經爲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 /串行器,以便它現在可以正確處理引用。下面的三個(5個)的方法已被更新:
toArray/toJson
fromArray/fromJson
applySerializeMetadataToArray
前兩個是自explainitory - 最後就是讓不必滋潤分貝成果轉化爲文檔應用序列化規則。
默認情況下,引用將被序列化到一個數組是這樣的:
[$ref: 'CollectionName/DocumentId']
的$ref
風格引用的是什麼蒙戈在內部使用,因此它似乎是適當的。給出了參考的格式,期望它可以用作REST API的URL。
默認行爲可以通過defineing替代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註釋支持繼承和覆蓋,所以它們可以很好地處理複雜的文檔結構。
爲了回答我的問題,@superdweebie製作了一個偉大的教義庫,他在下面描述了包含一個序列化器。如果您使用預先抓取,那麼您將返回所有文檔。目前,儘管您可能會遇到循環引用問題,但我們正在研究[一個特性](https://github.com/superdweebie/doctrineExtensions/issues/6)來實現最大嵌套深度選項。 – jhuet