मुझे मॉडल की नई या अपडेट की गई संस्थाओं को कैसे बचाना चाहिए?


10

Magento 2 में हमारे पास रिपॉजिटरी क्लासेस हैं। save()मैगेंटो 1.9 में अत्यधिक उपयोग की जाने वाली क्लासिक विधि को 2.04 या 2.05 से सही होने पर, हटा दिया जाता है। मैं नई वस्तु बनाने के लिए कारखानों का उपयोग कर रहा था और नए के गुणों को स्थापित करने के बाद, उदाहरण के लिए उत्पाद जिसे मैंने कहा है save():

$productFactory->create()->setName()...->save()

दूसरी ओर हमारे पास रिपॉजिटरी भी हैं, जिसमें विधि भी है save। मैं इसे संक्षेप में इस तरह से उपयोग कर रहा हूं:

$product = $productFactory->create()->setName()... $productRepository->save($product)

मेरे कोड में मेरे पास दोनों तरीकों से काम करने वाली कक्षाएं हैं। मैंने यह भी देखा है कि कभी-कभी अलग-अलग तरीकों का मतलब अलग-अलग व्यवहार होता है। क्या रिपॉजिटरी के साथ कुछ अतिरिक्त डेटा प्रदान करने का तरीका है?

मुझे इसे किस तरीके से करना चाहिए?

जवाबों:


10

आइए पहले देखते हैं, यदि आप save()किसी productमॉडल पर सीधे विधि का उपयोग करते हैं तो क्या होता है

/**
 * @var Magento\Catalog\Model\Product $product
 */
$product->save();

मॉडल वर्ग ही है

Magento\Catalog\Model\Product

इस वर्ग के भीतर, सेव () विधि की परिभाषा खोजें।

कोई नहीं मिला सही? खैर, वहाँ पहले () और उसके बाद से पहले () है, लेकिन खुद को नहीं बचा ()। दिलचस्प है, नहीं?

फिर, हमें मूल कक्षाओं को देखने की जरूरत है Magento\Catalog\Model\Product

हम के माध्यम से पारित करने की जरूरत है Magento\Catalog\Model\AbstractModelऔर Magento\Framework\Model\AbstractExtensibleModel, बस के अंत में पर पहुंचने Magento\Framework\Model\AbstractModel

निश्चित रूप से पर्याप्त है, यहां एक बचत () विधि है और यह कुछ ऐसा दिखता है

public function save()
{
    $this->_getResource()->save($this);
    return $this;
}

हम अब देखते हैं, जब भी सेव () को किसी मॉडल पर बुलाया जाता है, तो इस से सेव () विधि AbstractModelको कॉल किया जाता है, और कार्यान्वयन यह है कि रिज़र्व मोडल वास्तव में बचत करता है।

यह आखिरी कोई आश्चर्य की बात नहीं है कि हम हमेशा से हैं, क्योंकि मैगेंटो 1.0 में समय की शुरुआत से, किसी भी इकाई के बारे में मॉडल और संसाधन मॉडल दोनों का निर्माण करना।


अब, कैसे ProductRepositoryकाम करता है पर एक नज़र डालते हैं ।

खुली फाइल देता है

/vendor/magento/module-catalog/Api/ProductRepositoryInterface.php

यह इंटरफ़ेस मांग करता है कि अन्य तरीकों के बीच एक सेव () विधि है।

वास्तव में इस इंटरफ़ेस को कौन लागू कर रहा है?

खुली फाइल देता है

/etc/di.xml

और लाइन 10 की जांच करें

<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />

तो, स्वाभाविक रूप से हम अंदर () मेन्थोड को बचाने का निहितार्थ पाते हैं

/vendor/magento/module-catalog/Model/ProductRepository

और यह 444 पर शुरू होता है, कुछ ऐसा दिखता है

public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
{
    $tierPrices = $product->getData('tier_price');

    try {
    .... other code here ....

इस विधि से $ प्रकार की उत्पाद वस्तु \Magento\Catalog\Api\Data\ProductInterfaceपारित होने की उम्मीद है , लेकिन डिफ़ॉल्ट रूप से यह इसका समाधान करता है Magento\Catalog\Model\Product

नीचे 500 लाइन पर नीचे देख, एक tryबयान, हम कुछ इस तरह से देखते हैं

$this->resourceModel->save($product);

आप अच्छी तरह से अनुमान लगाया है! $this->resourceModelप्रकार \Magento\Catalog\Model\ResourceModel\Product, protectedलाइन 77 पर संपत्ति के रूप में घोषित किया गया है।

तो, फिर, ResourceModelवास्तव में बचत करता है।

लेकिन, रेखा 444 और 500 के बीच वास्तव में आपके प्रश्न का उत्तर है। यहां निष्पादित सभी कोड, वास्तव में, अंततः हो सकते हैं और प्रत्यक्ष मॉडल बचत और बचत के इस भंडार तरीके के बीच व्यवहार में अंतर पैदा करेंगे।

उदाहरण के लिए उत्पाद रिपॉजिटरी को उत्पाद लिंक मिलेंगे और प्रक्रिया करेंगे यदि ignore_links_flagसेट किया गया है 0, तो जांचें कि क्या यह पहले से मौजूद उत्पाद है आदि।

हमें शायद यह निष्कर्ष निकालने की आवश्यकता है कि यदि उत्पाद को बचाने के लिए भविष्य में किसी भी तरह की आवश्यकता है, तो उत्पाद मॉडल के बजाय उत्पाद रिपॉजिटरी को ओवरराइड करने से बेहतर तरीका यह हो सकता है।

उत्पादों को सहेजने और अद्यतन करने के लिए वही जाता है। मैं उत्पाद रिपॉजिटरी ऑब्जेक्ट का उपयोग करूंगा।

मैं आपसे कृपया /vendor/magento/module-cms/Model/PageRepository.php का भी उल्लेख करता हूं

इस तरह से एक सीएमएस पृष्ठ को रिपॉजिटरी के माध्यम से सहेजा जाएगा। यहां, चीजें सरल हैं। स्टोर आईडी सेट है और संसाधन मॉडल को तुरंत सहेजने के लिए कहा जाता है।

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


1

यह \Magento\Catalog\Api\Data\ProductInterfaceसीधे मॉडल के बजाय डेटा इंटरफेस (जैसे ) का उपयोग करने और मॉडल को लोड करने और बचाने के लिए रिपॉजिटरी का उपयोग करने के लिए प्रोत्साहित किया जाता है ।

Magento डेवलपर दस्तावेज़ देखें


1
ठीक है - यह पूरी इकाई के लिए सही तरीका है - लेकिन केवल कुछ विशेषता के मूल्य को अपडेट करने के लिए - मुझे लगता है कि लोड / बचत पूरी इकाई की सिफारिश नहीं की जाती है।
बार्टोज़ कुबिकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.