GetExtensionAttributes () को लागू करने का सही तरीका


11

मैं सोच रहा था, एक एक्स्टेंसिबल ईएवी मॉडल को लागू करने का सही तरीका क्या है।

मैं देखता हूं कि Magento\Catalog\Model\Product, विधि getExtensionAttributes()इस तरह से लागू की गई है:

public function getExtensionAttributes()
{
    $extensionAttributes = $this->_getExtensionAttributes();
    if (!$extensionAttributes) {
        return $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface');
    }
    return $extensionAttributes;
}

लेकिन दूसरों में, ग्राहक या श्रेणी के मॉडल की तरह

public function getExtensionAttributes()
{
    return $this->_getExtensionAttributes();
}

जो एक को जन्म दे सकता शून्य है, परिणाम extension_attributes कुंजी से पहले सेट नहीं किया गया।

व्यावहारिक रूप से, मैं पहले वाले को पसंद करूंगा। इस तरह मैं हमेशा एक उदाहरण प्राप्त करना सुनिश्चित कर सकता हूं Magento\Framework\Api\ExtensionAttributesInterface, भले ही मॉडल को केवल तत्काल किया गया हो।

लेकिन फिर अन्य मॉड्यूल में इसका उपयोग क्यों नहीं किया जाता है? क्या यह डेटा मॉडल के नए पृथक्करण के खिलाफ है जो हम ग्राहक मॉड्यूल में देखते हैं? यदि हां, तो हमें एक्सटेंशन विशेषताओं को कैसे आरंभ करना चाहिए?

जवाबों:


1

Magento अगर यह कोई विस्तार का श्रेय है एक खाली वस्तु उत्पन्न करने के लिए AbstractExtensibleObject :: _ getExtensionAttributes विधि अपडेट https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 तो यह अशक्त वापसी कभी नहीं होगा। उन्हें अभी भी एपीआई एनोटेशन को अपडेट करने की आवश्यकता है, उदाहरण के लिए विक्रेता / मैगनेटो / मॉड्यूल-ग्राहक / मॉडल / डेटा / ग्राहक.बीपी में

 /**
 * {@inheritdoc}
 *
 * @return \Magento\Customer\Api\Data\CustomerExtensionInterface|null
 */
public function getExtensionAttributes()
{
    return $this->_getExtensionAttributes();
}

2

मैं आंशिक रूप से अपने स्वयं के प्रश्न का उत्तर दे सकता हूं क्योंकि मुझे पता चला है कि जिस तरह से विधि को लागू किया गया है Magento\Catalog\Model\Productवह निश्चित रूप से गलत है और इससे खराब कीड़े हो सकते हैं:

यदि कोई extension_attributesडेटा अभी तक नहीं है, यानी _getExtensionAttributes()शून्य देता है, तो विधि एक्सटेंशन विशेषताओं इंटरफ़ेस का एक खाली उदाहरण देता है।

यह स्पष्ट अनुबंध को पूरा करने के लिए अच्छा है और "शून्य पर एक सदस्य समारोह में कॉल" त्रुटियों को रोकता है लेकिन यह हमेशा एक नया खाली उदाहरण देता है, जो निहित अनुबंध को पूरा नहीं करता है, अर्थात मुझे इस विशिष्ट उदाहरण के लिए एक एक्सटेंशन विशेषता कंटेनर मिलता है ।

इसका मत:

$product->getExtensionAttributes()->setStockItem($stockItem);
var_dump($product->getExtensionAttributes()->getStockItem());

आउटपुट:

NULL

एक बेहतर कार्यान्वयन इस तरह दिखेगा:

public function getExtensionAttributes()
{
    $extensionAttributes = $this->_getExtensionAttributes();
    if (!$extensionAttributes) {
        $extensionAttributes = $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface');
        $this->_setExtensionAttributes($extensionAttributes);
    }
    return $extensionAttributes;
}

लेकिन फिर अन्य मॉड्यूल में इसका उपयोग क्यों नहीं किया जाता है? क्या यह डेटा मॉडल के नए पृथक्करण के खिलाफ है जो हम ग्राहक मॉड्यूल में देखते हैं? यदि हां, तो हमें एक्सटेंशन विशेषताओं को कैसे आरंभ करना चाहिए?

उस के लिए, मैं अभी भी एक जवाब नहीं है



क्या आपको कभी इस बात का जवाब मिला - या इससे निपटने के लिए सबसे अच्छा कैसे है? मुझे वर्तमान में एक आदेश ऑब्जेक्ट का विस्तार करते हुए यह समस्या मिल रही है।
ओल'बोब डोले

@ ol'bobdole, मैं NULL के लिए प्राप्त कर रहा था $order->getExtensionAttributes() और नीचे दिए गए आदेश के बाद हल हो गया था $order = $this->orderRepositoryInterface->get($order->getId());:। ऑर्डर रिपॉजिटरी इंटरफ़ेस है Magento\Sales\Api\OrderRepositoryInterface। यकीन नहीं होता अगर आपका मुद्दा एक ही था
सर्जन गौतम

0

विभिन्न एक्सटेंशन में कोड का उपयोग अलग-अलग तरीके से किया जाता है। उस इंटरफ़ेस में किसी भी विशेषता को बांधने के लिए कार्यक्षमता का उपयोग किया जाता है। इसकी बेहतर समझ के लिए, इस लिंक को देखें: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


यह लेख मेरे प्रश्न का उत्तर नहीं देता है। मुझे पता है कि मौजूदा संस्थाओं में एक्सटेंशन विशेषताओं को कैसे जोड़ा जाए, मैं विशेष रूप getExtensionAttributes()से कस्टम संस्थाओं के कार्यान्वयन के बारे में पूछ रहा था
फाबियान शेंगलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.