आइए पहले देखते हैं, यदि आप 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 का भी उल्लेख करता हूं
इस तरह से एक सीएमएस पृष्ठ को रिपॉजिटरी के माध्यम से सहेजा जाएगा। यहां, चीजें सरल हैं। स्टोर आईडी सेट है और संसाधन मॉडल को तुरंत सहेजने के लिए कहा जाता है।
इस अंतिम सूचना के साथ, आप यह निष्कर्ष निकालेंगे कि कुछ मामलों में, रिपॉजिटरी और मॉडल सेव के बीच उतने अंतर नहीं हो सकते हैं, लेकिन वैसे भी मुझे उम्मीद है कि जब भी आपको ऐसा करने की आवश्यकता हो, आप उन्हें स्थान देने के लिए अभी सुसज्जित हैं।