/ / पुनर्स्थापना ArestCollection तत्वों RESTAPI में - json, आराम, सहानुभूति, सरणी

RESTAPI में ArrayCollection तत्व reindexing - जेसन, आराम, symfony, arraycollection

कल्पना कीजिए, मैं एक सरणी संग्रह है $items, और एक विधि लागू की removeItem मेरे में SomeEntity संस्था वर्ग,

public function removeItem(Item $item)
{
$this->items->removeElement($item);
return $this;
}

और एक नियंत्रक क्रिया जिसे एक PATCH अनुरोध प्राप्त होता है:

public function patchAction(Request $request, SomeEntity $entity) {
$form = ...;

$form->handleRequest($request);
if ($form->isValid()) {
...
$this->get("doctrine.orm.entity_manager")->flush();

return $entity;
}

return $form;
}

कल्पना कीजिए कि इसका उदाहरण SomeEntity वर्ग के रूप में आइटम रखती है [0 => {ITEM}, 1 => {ITEM}, 2 => {ITEM}, 3 => {ITEM}] (वस्तुओं का अनुक्रमित सरणी)। यदि आप एक अनुरोध भेजते हैं getAction और प्राप्त करते हैं SomeEntity JSON प्रारूप में आपके सामने की परियोजना का उद्देश्य,एक वस्तु में उन वस्तुओं का प्रकार वस्तुओं का अनुक्रमित सरणी होगा (आप सरणी विधियों के साथ उन पर पुनरावृति कर सकते हैं), लेकिन यदि आप किसी ऑब्जेक्ट से एक या एक से अधिक पैटर्न विधि से निकालते हैं और JSON प्रतिक्रिया प्राप्त करते हैं, तो आपको एक वस्तु मिल सकती है इसमें वस्तुओं के साथ टाइप करें, क्योंकि PATCH अनुरोध के बाद कुछ कुंजियों को हटा दिया गया है और प्रतिक्रिया में SomeEntity वर्ग की वस्तु अब अनुक्रमित सरणी नहीं रखती है, इसके बजाय वस्तुओं का एक ऑब्जेक्ट होगा। इसका कारण यह है, जब आप किसी सरणी को json ऑब्जेक्ट में बदलते हैं तो आप दो भिन्न परिणाम प्राप्त कर सकते हैं

  1. वस्तुओं की सारणी (सारणी) यदि चाबियाँ अनुक्रमित हैं (जैसे: 0,1,2,3, ...)
  2. ऑब्जेक्ट्स (सरणियों) का उद्देश्य यदि कुंजियों को अनुक्रमित नहीं किया जाता है (जैसे: 0,2,3,6, ...)

इस समय मैं मौजूदा समस्या को संशोधित करने (तत्वों को फिर से बनाने) के साथ इस समस्या को हल कर रहा हूं removeItem इकाई वर्ग में विधि, इस प्रकार है:

public function removeItem(Item $item)
{
$this->items->removeElement($item);

if (!$this->items->isEmpty()) {
$items = new ArrayCollection();
foreach ($this->items as $item) {
$items->add($item);
}

$this->items = $items;
}

return $this;
}

इसे हल करने का एक बेहतर तरीका हो सकता है? आपके द्वारा इस समस्या को कैसे हल किया जाएगा?

मैं FOSRestBundle और JmsSerializerBundle का उपयोग कर रहा हूं।

उत्तर:

जवाब के लिए 2 № 1

यह एक आम समस्या है - देखें https://github.com/schmittjoh/JMSSerializerBundle/issues/373 इस मुद्दे वाले अन्य लोगों के लिए। आपके कार्यों में इसे हल करने के लिए निश्चित रूप से एक छोटा सा तरीका है जहां आप प्रत्येक तत्व के माध्यम से लूपिंग से आइटम हटाते हैं:

public function removeItem(Item $item)
{
$this->items->removeElement($item);
$this->items= new ArrayCollection($this->items->getValues());

return $this;
}

उस टिकट में अन्य वर्कअराउंड सूचीबद्ध हैं जो आपकी आवश्यकताओं के अनुरूप हो सकते हैं या नहीं - यदि आप एक वैश्विक समाधान चाहते हैं तो आप इसमें सक्षम हो सकते हैं JsonSerializationVisitor ओवरराइड करें वर्ग जो एक सरणी में रखता है।