簡體   English   中英

使用 Symfony Serializer Component 和 AbstractNormalizer::OBJECT_TO_POPULATE 反序列化實體數組

[英]Deserialize a entities array with Symfony Serializer Component and AbstractNormalizer::OBJECT_TO_POPULATE

我已經反序列化為一個對象數組:

$encoders = [new JsonEncoder()];
$normalizers = [new ObjectNormalizer(), new GetSetMethodNormalizer(), new ArrayDenormalizer()];
$serializer = new Serializer($normalizers, $encoders);

$clients = $serializer->deserialize($myJson, 'App\Entity\Client[]', 'json');

並且還將一個實體反序列化為現有實體(在數據庫中沒有 INSERT 而是 UPDATE):

$clientDb = $clientRepository->find(1);
$client = $serializer->deserialize($myJson, Client::class, 'json', [AbstractNormalizer::OBJECT_TO_POPULATE => $clientDb ]);

但是當我想兩者都做時,學說只插入到數據庫中:

$clients = $serializer->deserialize($myJson, 'App\Entity\Client[]', 'json', [AbstractNormalizer::OBJECT_TO_POPULATE => $clientRepository->findAll()]);

我錯過了什么 ?

-- 我找到的官方文檔沒有提到它: https : //symfony.com/doc/current/components/serializer.html#deserializing-in-an-existing-object --

編輯:我設法手動將 json 解碼為數組,然后對其進行循環,將循環中的每個項目重新編碼為 json 並最終反序列化它們。 但是如果有沒有解碼/循環/編碼的方法,我更喜歡使用它!

檢查您自己提到的文檔中的以下信息:

AbstractNormalizer::OBJECT_TO_POPULATE 僅用於頂級對象。 如果該對象是樹結構的根,則規范化數據中存在的所有子元素都將使用新實例重新創建。

當 AbstractObjectNormalizer::DEEP_OBJECT_TO_POPULATE 選項設置為 true 時,根 OBJECT_TO_POPULATE 的現有子項將從規范化數據更新,而不是非規范化器重新創建它們。 請注意, DEEP_OBJECT_TO_POPULATE 僅適用於單個子對象,而不適用於對象數組。 當存在於規范化數據中時,它們仍將被替換。

因此,基於此,不支持一次填充對象數組。 你必須通過你的陣列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM