जब हमें Magento 2 में एक रिपॉजिटरी और फैक्टरी का उपयोग करना चाहिए?


75

मैं Magento 2 में ट्यूटोरियल के एक जोड़े के माध्यम से चला गया हूं, और यह मुझे थोड़ा भ्रमित करता है। मैं देख सकता हूं कि मूल रूप से दो तरीके हैं जिनके द्वारा हम व्यावसायिक संस्थाओं को पढ़ / लिख सकते हैं:

डेटा पुनः प्राप्त करो

एक फैक्टरी दृष्टिकोण का उपयोग करना

$object = $this->myFactory->create();
$object->load($myId);

एक रिपॉजिटरी दृष्टिकोण का उपयोग करना

$repo   = $this->myRepository();
$object = $repo->getById($myId);

डेटा बचाना

एक फैक्टरी दृष्टिकोण का उपयोग करना

$object = $this->myFactory->create();
$object->load($myId);
$object->setData('something', 'somethingDifferent')->save();

एक रिपॉजिटरी दृष्टिकोण का उपयोग करना

$repo   = $this->myRepository();
$object = $repo->getById($myId);
$object->setData('something', 'somethingDifferent');
$repo->save($object);

मैं यह भी देख सकता हूं कि, निर्भरता इंजेक्शन का उपयोग करके एक रिपॉजिटरी और फैक्ट्री क्लास दोनों को इंजेक्ट किया जा सकता है। यह कम से कम मेरे लिए भ्रामक है।

हमें एक रिपॉजिटरी दृष्टिकोण और एक कारखाने के दृष्टिकोण का उपयोग कब करना चाहिए? हमें सबसे अच्छा अभ्यास क्या है?


फैक्ट्री, कलेक्शनफैक्टरी और रिपॉजिटरी के उपयोग का एक अच्छा उदाहरण \ Magento \ Setup \ फिक्स्चर \ श्रेणी पर देखा जा सकता है
रिकार्डो मार्टिन्स

जवाबों:


72

यदि कोई रिपॉजिटरी है और वह वही करता है, जिसकी आपको अच्छी जरूरत है, तो हमेशा रिपॉजिटरी को प्राथमिकता दें।

रिपॉजिटरी सेवा अनुबंध (वे इंटरफेस के कार्यान्वयन हैं Api) का हिस्सा हैं, इसका मतलब है कि वे अन्य मॉड्यूल के लिए एक सार्वजनिक इंटरफ़ेस के रूप में हैं।

पूर्ण लोडिंग के लिए रिपोजिटरी का उपयोग करें

$model->load()सेवा अनुबंध का हिस्सा नहीं है। मेरे पास उस विशेष विषय पर एक प्रश्न था, आपको उत्तर उपयोगी मिल सकते हैं: क्या सेवा अनुबंधों में $ मॉडल-> लोड () को प्राथमिकता देने का कोई कारण है?

नए निकाय बनाने के लिए कारखानों का उपयोग करें

रिपॉजिटरी एक नई इकाई बनाने के तरीकों के साथ नहीं आते हैं, इसलिए उस स्थिति में, आपको एक कारखाने की आवश्यकता होगी। लेकिन इंटरफ़ेस के लिए कारखाने का उपयोग करें , जैसे Magento\Catalog\Api\Data\ProductInterfaceFactory- यह डीआई कॉन्फ़िगरेशन के आधार पर सही कार्यान्वयन बनाएगा।

फिर repository->save()इसे बचाने के लिए विधि का उपयोग करें ।

यदि आपको अधिक नियंत्रण की आवश्यकता है तो संग्रह कारखानों का उपयोग करें

निम्नलिखित आधिकारिक मैगेंटो सर्वोत्तम अभ्यास नहीं है, लेकिन वर्तमान में, रिपॉजिटरी आपको लोड करने के लिए ठीक से नियंत्रण नहीं देते हैं। खोज मानदंड एपीआई आपको फ़िल्टर को परिभाषित करने देता है, लेकिन उदाहरण के लिए, विशेष ईएवी विशेषताओं का चयन करने का कोई तरीका नहीं है या निर्दिष्ट करें कि किस तालिका में शामिल होना है।

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


2
क्या आप नई संस्थाओं को बनाने के लिए उपयोग कारखानों के बारे में एक कोड उदाहरण दे सकते हैं , स्पष्टीकरण कुछ विवरणों को समझने में मुश्किल है। आपका बहुत बहुत धन्यवाद।
कुंजी शांग

1
@ क्या यह मदद करता है? devdocs.magento.com/guides/v2.2/extension-dev-guide/…
Fabian Schmengler

धन्यवाद। लेकिन use the factory for the interface, such as Magento\Catalog\Api\Data\ProductInterfaceFactory - it will create the right implementation based on DI configuration.बात जो मैं नहीं समझ सकता, देव गाइड परिचय नहीं करता है InterfaceFactory , कैसे उपयोग करने के लिए repository->save()नई संस्थाओं को बचाने के लिए विधि? मैं केवल नई संस्थाओं को बचाने के लिए कारखाने का उपयोग कर सकता हूं, रिपॉजिटरी नहीं।
कुंजी शांग

@Key शांग, इसका मतलब है कि इंटरफ़ेस आपको टेबल के प्रत्येक और हर कॉलम को बचाने के लिए सभी सेट डेटा फ़ंक्शन देगा ताकि नए रिकॉर्ड को सहेजने के लिए जहां भी संभव हो इंटरफ़ेस का उपयोग करने का प्रयास करें। InterfaceFactory कक्षाएं di के भाग के रूप में बनाई जाती हैं: संकलित करें ताकि आप उन्हें var / पीढ़ी फ़ोल्डर में देख सकें।
स्टीवंसगैर

@stevensagaar धन्यवाद, अब मैं इसे समझ सकता हूं।
प्रमुख शांग

21

अच्छा प्रश्न।

भले ही दोनों रिपोजिटरी और फैक्ट्रीज हमें एक एंटिटी का उपयोग करने दें, मुझे लगता है कि हमें उनकी जिम्मेदारी पर ध्यान देना चाहिए ।

मैगेंटो प्रलेखन से : "फैक्ट्रीज सेवा वर्ग हैं जो गैर-इंजेक्शन योग्य कक्षाओं को त्वरित करते हैं, जो एक डेटाबेस इकाई का प्रतिनिधित्व करने वाले मॉडल हैं। वे ObjectManager और व्यवसाय कोड के बीच अमूर्त की एक परत बनाते हैं।"

एलन स्टॉर्म के लेख से : "एक वस्तु भंडार के लिए अपनी वस्तु जानकारी को पढ़ने और लिखने के लिए एक रिपॉजिटरी ऑब्जेक्ट जिम्मेदार है"

मेरी व्याख्या यह है: यदि हमारा उद्देश्य गैर-इंजेक्शन (तथाकथित "नई") वस्तुओं के साथ काम करना है, तो हमें कारखानों का उपयोग करना चाहिए; यदि हमारा ध्यान ऑब्जेक्ट स्टोर पर वस्तुओं को खोजने / पढ़ने / लिखने पर है तो हमें रिपॉजिटरी का उपयोग करना चाहिए।

यह विषय के लिए मेरा आदर्शवादी दृष्टिकोण है; ध्यान रखें कि वास्तविक कार्यान्वयन हमें चीजों को गड़बड़ाने के लिए मजबूर कर सकता है, जैसा कि एलन द्वारा बताया गया है।

का आनंद लें।


5

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

इस बारे में एलन स्टॉर्म द्वारा लिखा गया एक बहुत ही विस्तृत लेख है, जिसमें बताया गया है कि रिपॉजिटरी का उपयोग कैसे करें, लेकिन इस नई विधि की कुछ कमियों को भी देखें : http://alanstorm.com/magento_2_understanding_object_repositories/

इसके अलावा, मैगेंटो प्रलेखन से, इस नए aproach के लाभों की व्याख्या करते हुए: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.HTML


2
जवाब के लिए धन्यवाद। मैं वास्तव में alanstorm के लेख से मेरे सिर पर यह संदेह मिलता है। :)
राजीव के टॉमी

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

मैं आपकी टिप्पणी से 100% सहमत हूँ। मैं ऐंसी ही उम्मींद रखता हूँ। कृपया फैबियन के उत्तर भी देखें।
राजीव के टॉमी

हां, मैंने देखा :) पहले से ही उनके जवाब को उकेरा। महान प्रश्न के लिए धन्यवाद!
मरीना विलासी

इसके अलावा, मैंने कहीं पढ़ा है कि स्क्रिप्ट $setup->updateTableRow(...);या कारखानों को स्थापित / अपग्रेड करने में निचले स्तर के डेटा हेरफेर विधि का उपयोग करना ठीक है , मुझे यकीन नहीं है, लेकिन ऐसा लगता है कि उच्च स्तर का उपयोग करने के लिए तर्क उस क्षेत्र पर भी लागू होते हैं, आपको क्या लगता है?
medmek

1

आशा है कि यह उत्तर अन्य विस्तार डेवलपर्स को भी मदद कर सकता है।

हमें केवल रिपोजिटरी का उपयोग करके मॉडल को सहेजना होगा।

  1. Magento 2 में फैक्टरी मॉडल बहुत सीमित डेटा रखता है।
  2. दूसरी ओर, रिपॉजिटरी मॉडल में ग्राहक, उत्पाद आदि से संबंधित ईव विशेषताओं के मामले में सभी डेटा होते हैं।
  3. बचत मॉडल के लिए, किसी भी इकाई को बचाने के लिए हमेशा रिपॉजिटरी का उपयोग करें, अगर कारखाने के मॉडल का उपयोग मॉडल को बचाने के लिए किया जाता है, तो यह उस इकाई (ग्राहक, उत्पाद, आदि) से संबंधित सभी गैर-सिस्टम ईआरवी विशेषताओं को हटा देता है।

  4. मॉडल उद्देश्य लोड करने के लिए, रिपॉजिटरी getById () विधि का उपयोग करके मॉडल प्राप्त करने का सबसे अच्छा विकल्प है।

मैं मॉडल बचत उद्देश्य के लिए विशेष रूप से यथासंभव रिपोजिटरी का उपयोग करने की सिफारिश करूंगा।


1

अब लोड, सेव, डिलीट मेथड्स (मॉडल) को हटा दिया गया है। यदि हम संसाधन मॉडल या रिपॉजिटरी का उपयोग कर सकते हैं।

Magento अब सेव, डिलीट, लोड ऑपरेशंस के लिए एंटिटी मैनेजर कॉन्सेप्ट का उपयोग कर रहा है।

संसाधन मॉडल में उन कार्यों को पूरा करने के लिए इकाई प्रबंधक ऑब्जेक्ट होता है।

$categoryModel = $this->_objectManager->create('\Magento\Catalog\Model\CategoryFactory')->create();        
  $categoryResource = $this->_objectManager->create('\Magento\Catalog\Model\ResourceModel\Category');        
  $categoryResource->load($categoryModel, 3);        
  echo $categoryModel->getName();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.