Magento 2 DI सर्वोत्तम अभ्यास


19

मान लें कि मैं एक Magento 2 एक्सटेंशन का निर्माण कर रहा हूं जो .... अच्छा ... महत्वपूर्ण नहीं है। मान लीजिए कि यह सुपर कमाल का सामान करता है।
लेकिन मैं यह सुनिश्चित करना चाहता हूं कि यह उचित मानकों का उपयोग करके बनाया गया है ताकि अन्य डेवलपर्स इसे बढ़ा सकें।

मुझे इंटरफेस के साथ संयोजन में DI का उपयोग कब करना चाहिए और कब नहीं करना चाहिए?
यह स्पष्ट करने के लिए यहां एक मुख्य उदाहरण है।

क्लास Magento\Core\Helper\Dataमें एक कंस्ट्रक्टर होता है:

public function __construct(
    \Magento\Framework\App\Helper\Context $context,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Framework\App\State $appState,
    PriceCurrencyInterface $priceCurrency,
    $dbCompatibleMode = true
) {
    parent::__construct($context);
    $this->_scopeConfig = $scopeConfig;
    $this->_storeManager = $storeManager;
    $this->_appState = $appState;
    $this->_dbCompatibleMode = $dbCompatibleMode;
    $this->_priceCurrency =  $priceCurrency;
}

मेरा प्रश्न संस्करण पर केंद्रित है \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig(मुझे पता है कि एक ही निर्माता में अन्य हैं, लेकिन एक स्पष्टीकरण उन सभी मामलों में फिट होगा जो मुझे लगता है)।

di.xmlकोर मॉड्यूल से के अनुसार var इसका उदाहरण होगा Magento\Framework\App\Config:

<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />

लेकिन मैं आसानी से बदल सकते हैं कि अगर मुझे जरूरत है।

मुझे अपने कोड में उस तरह के इंटरफेस का उपयोग कब करना चाहिए?
मैंने यह अधूरा नमूना मॉड्यूल (विज्ञापन के लिए खेद है) बनाया है, जहां मैंने ऐसे इंटरफेस का उपयोग किया है, लेकिन वे सभी कोर से आते हैं। मैंने अपना खुद का एक नहीं बनाया है। क्या मैं?


"मान लीजिए कि यह सुपर कमाल का सामान करता है।" क्या इसमें ऐसे लोगों का फ़्लोटिंग हेड है जो स्टैकटेक्चेंज में ऑनलाइन हैं? क्योंकि मैं वह स्थापित करता हूं;)
डेविड मैनर्स

1
@DavidManners मैं अपने सभी 1.x एक्सटेंशन को 2.0 में पोर्ट करने की कोशिश करूंगा ताकि इसे भी पोर्ट किया जा सके। मुझे तैरने वाले हिस्से के बारे में नहीं पता, लेकिन मैं देखूंगा कि मैं क्या कर सकता हूं।
मेरियस

Imho कि एक Mage2 विशिष्ट प्रश्न नहीं है, अधिक आम तौर पर "जब इंटरफेस का उपयोग करने के लिए"। यह निर्भर करता है कि आप कहां चाहते हैं कि कोई व्यक्ति आपके विस्तार को बढ़ाने में सक्षम हो। मैं हर जगह कहूंगा कि आप व्यावसायिक तर्क के साथ काम करें, जो बदल सकता है। ;) इसके अलावा व्यवहार के बिना वस्तुओं (जैसे साधारण डेटा ऑब्जेक्ट) आमतौर पर नहीं बदलेगा।
टोबियास

1
@TobiasZander, आपके कहने का मतलब है कि मुझे लगभग हर चीज़ के लिए एक इंटरफ़ेस बनाना होगा? लानत है कि बहुत काम है।
मेरियस

@ मार्स, अगर आप 100% लचीला होना चाहते हैं, तो किसी तरह हाँ। लेकिन मैं इसे खत्म नहीं करेगा। मैं व्यक्तिगत रूप से भी odetocode.com/blogs/scott/archive/2009/06/08/… को एक परिचय के रूप में पसंद करता हूं जब यह वास्तव में उपयोगी होता है
Tobias

जवाबों:


9

Imho कि एक Mage2 विशिष्ट प्रश्न नहीं है, अधिक आम तौर पर "जब इंटरफेस का उपयोग करने के लिए"। यह निर्भर करता है कि आप कहां चाहते हैं कि कोई व्यक्ति आपके विस्तार को बढ़ाने में सक्षम हो। मैं हर जगह कहूंगा कि आप व्यावसायिक तर्क के साथ काम करें, जो बदल सकता है। ;) इसके अलावा व्यवहार के बिना वस्तुओं (जैसे साधारण डेटा ऑब्जेक्ट) आमतौर पर नहीं बदलेगा।

यदि आप 100% लचीले होना चाहते हैं, तो किसी तरह आपको हर जगह इंटरफेस का उपयोग करना होगा। लेकिन मैं इसे खत्म नहीं करेगा। मैं व्यक्तिगत रूप से भी http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx को एक परिचय के रूप में पसंद करता हूं जब यह वास्तव में उपयोगी होता है।


7

Magento2 SOLID सिद्धांतों के उपयोग को बढ़ावा देता है ।

निर्भरता उलटा सिद्धांत प्रत्यक्ष कहता है, उस कोड को अमूर्त (इंटरफेस) पर निर्भर होना चाहिए।

इंटरफ़ेस पृथक्करण सिद्धांत कहता है कि कई क्लाइंट-विशिष्ट इंटरफेस एक सामान्य-उद्देश्य इंटरफ़ेस से बेहतर हैं। कक्षाएं संरक्षित इंटरफ़ेस को भी परिभाषित कर सकती हैं, इसलिए आर्किटेक्चर के दृष्टिकोण से इंटरफेस अधिक पसंद किए जाते हैं।

इसके अलावा PHP कई वर्गों के वंशानुक्रम का समर्थन नहीं करता है, लेकिन इंटरफेस के कई कार्यान्वयन का समर्थन करता है। यह इंटरफेस के लिए एक और बिंदु है।

तो, एक सरल नियम का उपयोग किया जा सकता है: यदि आप नहीं जानते कि क्या उपयोग करना है, तो हमेशा उपयोग करते हैं इंटरफेस

पुनश्च। प्रदर्शन यह मेरे लिए इंटरफेस का उपयोग नहीं करने का कारण नहीं है


मैं उत्सुक हूँ अगर किसी भी तरह से इंटरफेस के प्रभाव का उपयोग प्रदर्शन?
अमृतश्री

1
ऑटोलॉड फंक्शन की कॉल मुफ्त नहीं है। उदाहरण देखें: ( dl.dropboxusercontent.com/u/3103646/... )
कैंडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.