Magento 2 हेल्पर उदाहरण


11

जब मुझे लगता है कि मैंने अपने सिर को डिगो सिस्टम के चारों ओर लपेटा हुआ है, तो मैगेंटो 2 से कुछ आता है और इसे लपेटता है।
मैं कोर कोड में सहायक को एक्सेस करने के विभिन्न तरीकों को देखता हूं।
उदाहरण के लिए Magento\Catalog\Controller\Category::_initCategoryवहाँ यह है:

if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
    return false;
}

लेकिन Magento\Catalog\Block\Category\Viewसहायक में अंतःक्षिप्त int वह कंस्ट्रक्टर है

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Model\Layer\Category $catalogLayer,
    \Magento\Framework\Registry $registry,
    \Magento\Catalog\Helper\Category $categoryHelper,
    array $data = array()
) {
    $this->_categoryHelper = $categoryHelper;
    $this->_catalogLayer = $catalogLayer;
    $this->_coreRegistry = $registry;
    parent::__construct($context, $data);
}

यह मुझे यह सोचने के लिए प्रेरित करता है कि नियंत्रकों और ब्लॉकों (और मॉडल) में सहायकों को अलग-अलग तरीके से एक्सेस किया जाना चाहिए, लेकिन फिर मुझे एक नियंत्रक मिला जहां कंस्ट्रक्टर में एक सहायक इंजेक्ट किया जाता है Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute

कृपया मेरे लिए कोहरे को साफ करें।
मुझे DI का उपयोग कब करना चाहिए और मुझे कब उपयोग करना चाहिए objectManager? और क्यों?
मैंने इस प्रश्न को पढ़ा है: Magento 2 में तत्काल सहायक । यह उस पर केवल एक अनुवर्ती प्रश्न है।

जवाबों:


10

मैं डीआई को पसंद करूंगा जहां संभव हो, वस्तु प्रबंधक का उपयोग करना पहले से ही लोकतंत्र के कानून का उल्लंघन है। ऑब्जेक्ट मैनेजर का उपयोग करते समय ये निर्भरताएं केवल विधि लॉजिक में छिपी होती हैं।


हां। मैं सहमत हूँ। मैं DI का उपयोग करूंगा, लेकिन मैं उत्सुक हूं कि यह कोर में क्यों किया जाता है? हो सकता है कि किसी ने मेरे द्वारा बताई गई कक्षाओं को फिर से प्राप्त नहीं किया, फिर भी?
मारियस

अफाक वे अभी भी बहुत कुछ बदल रहे हैं और आशा है कि वे इन स्थानों को भी छू लेंगे। लेकिन प्राथमिकताओं के बारे में भी नहीं जानते हैं, जो कि वास्तव में किसी बिंदु पर जारी करना चाहते हैं, तो उन्हें मौजूद होना चाहिए। तो शायद कुछ नई सुविधाएँ या अन्य बुरे अभ्यास पहले तय हो जाएंगे।
टोबियास

यदि आपके पास 10 फ़ंक्शन की कक्षा है और केवल 1 फ़ंक्शन के लिए विशिष्ट मॉडल की आवश्यकता है? 10 कार्यों में से प्रत्येक के लिए निर्माता इंजेक्शन के माध्यम से मॉडल को लोड करने के लिए (प्रदर्शन के दृष्टिकोण से) बेमानी नहीं होगा, जबकि हम इसे केवल 1 एकल फ़ंक्शन के अंदर ऑब्जेक्ट मैनेजर का उपयोग करके लोड कर सकते हैं?
जॉनीफ्री

6

मैं Magento के कार्यान्वयन के बारे में इतना नहीं जानता, लेकिन ऐसा लगता है कि ObjectManagerयह एक सेवा लोकेटर है

आम तौर पर एक वस्तु में निर्भरता का उपयोग करने के लिए एक सेवा लोकेटर का उपयोग करना बहुत बुरा है, इस लेख को देखें

स्पष्ट रूप से एक निर्माता के माध्यम से अपनी निर्भरता को परिभाषित करना एक बेहतर दृष्टिकोण है। यह यूनिट परीक्षण में सहायता करता है और सेवाओं को परिभाषित नहीं किए जाने के साथ समय के मुद्दों को चलाता है।

ऑब्जेक्ट प्रबंधक को एक वर्ग में इंजेक्ट करना मूल रूप से आपकी कक्षा में एक रजिस्ट्री को इंजेक्ट करना है, जिसकी आपके सभी एप्लिकेशन सेवाओं तक पहुंच है, जो स्पष्ट रूप से सही नहीं है।

मैं ZF2 का एक उचित सा उपयोग करता हूं और आम तौर पर सेवाओं, नियंत्रकों और किसी भी वर्ग के लिए छोटे कारखाने वर्गों को परिभाषित करता हूं , जिन पर निर्भरता की आवश्यकता होती है। इन फैक्ट्री कक्षाओं में सेवा लोकेटर तक पहुंच होती है और वे सभी सेवाएं प्राप्त होती हैं, जो वस्तु पर निर्भर करती है, और उन्हें कंस्ट्रक्टर के माध्यम से इंजेक्ट करती है। फैक्ट्री क्लास में सर्विस लोकेटर का उपयोग करना ठीक है क्योंकि यह ज्यादातर कोड को फेंक देता है, उदाहरण के लिए कुछ इस तरह ।

इन कारखानों का परीक्षण अभी भी आसान है ।

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

यह किसी ऐसे व्यक्ति से है जिसका उपर्युक्त पेटेंटों तक सीमित है, इसलिए मैं इस मामले पर अन्य विचारों / अनुभवों को सुनना चाहूंगा!

अधिक पढ़ना


अच्छी व्याख्या के लिए धन्यवाद। मेरा सवाल था "कोर में एक सहायक तक पहुंचने के 2 तरीके क्यों हैं?" इसलिए यह थोड़ा ऑफ-टॉपिक है लेकिन इसने कुछ अन्य संदेह को दूर कर दिया है जो मेरे पास था। :) धन्यवाद।
मेरियस

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

5

सहायक (टेम्प्लेट में) उपयोग करने का दूसरा तरीका है:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]')->getMethodName();

मुझे आशा है कि यदि आप पहले से ही नहीं जानते तो यह उपयोगी है।


यह किसी तरह वस्तु प्रबंधक का उपयोग करने के समान है। यकीन नहीं होता कि यह सबसे अच्छा विचार है।
मेरियस

1
उपरोक्त विधि केवल टेम्प्लेट के लिए है जहाँ तक मैं जानता हूँ। ऑब्जेक्ट मैनेजर का उपयोग नियंत्रकों, ब्लॉकों, मॉडल आदि में किया जाता है
rbncha

1
यह कोड के समान बॉलपार्क में नहीं है क्योंकि टेम्प्लेट पर कोई कोड निर्भरता नहीं हैं। टेम्प्लेट केवल उपभोक्ता हैं और टूटे हुए एनकैप्सुलेशन के साथ किसी भी क्लाइंट को प्रदूषित नहीं करते हैं।
डेन्कोरियो

मैं नहीं जानता कि डेन्कोरियो क्या कहना चाह रहा है। लेकिन किसी भी मॉड्यूल के सहायक को कॉल करने का सबसे अच्छा तरीका यह है। यह मैजेंटो है। जैसा कि वे कहते हैं, हर ब्लॉक / अनुभाग कोड को कोर को छूने के बिना कॉल करने योग्य / संशोधित करने का इरादा है। तो, सब कुछ परस्पर जुड़ा हुआ है या निर्भरताएं हैं।
rbncha

2

हालांकि यह पुराना सवाल है, मुझे यकीन नहीं है कि मारियस को इसका जवाब मिला है या नहीं । मेरा मानना ​​है कि मारियस इसका बेहतर जवाब दे सकता है। मैं संक्षेप में इसका जवाब देना चाहूंगा। क्यों Magento 2 सहायक के बजाय DI का उपयोग करने का सुझाव देता है?

  • इकाई परीक्षण में अलगाव संभव / आसान बनाना
  • स्पष्ट रूप से एक वर्ग की निर्भरता को परिभाषित करना
  • अच्छे डिजाइन की सुविधा (उदाहरण के लिए एकल जिम्मेदारी सिद्धांत)
  • अपने मॉड्यूल में DI का उपयोग करने से असंगतता के कीड़े का खतरा कम हो जाता है जब Magento उन इंटरफेस के अंतर्निहित कार्यान्वयन को बदल देता है। विस्तार डेवलपर्स के लिए समझने के लिए यह एक महत्वपूर्ण अवधारणा है।

क्यों M2 कोर कुछ मामलों में DI का उपयोग नहीं कर सकता है?

  • कक्षाओं की घटती संख्या
  • अनावश्यक इंटरफेस का निर्माण नहीं
  • असंगति बग का कोई जोखिम नहीं

हालांकि कोर कैटलॉग मॉड्यूल का उपयोग सहायक के रूप में किया गया है, इसने डीआई का बड़े पैमाने पर उपयोग किया है। अपने शोध में, मैंने पाया कि Magento 2 ने कोर कैटलॉग हेल्पर फ़ाइलों में कुछ फ़ंक्शन का उपयोग किया है जो सेवा अनुबंध के लिए उपयुक्त नहीं हैं।

यदि आपको स्पष्ट रूप से एक Magento के परिभाषित वर्ग (जैसे कि \ Magento \ कैटलॉग \ Model \ Product) का उपयोग करना चाहिए, तो सेवा अनुबंध इंटरफ़ेस के बजाय कंक्रीट कार्यान्वयन के आधार पर अंतर्निहित निर्भरता को स्पष्ट करें।

निस्संदेह, विस्तार डेवलपर को हेल्पर जैसे Magento1 के बजाय DI का उपयोग करना चाहिए। Magento 2 के दिशानिर्देशों के अनुसार लागू करते समय, नतीजा सीमित है। सिफारिशें तोड़ते समय, समस्याएं होती हैं।


हां, मुझे इस बीच अपना जवाब मिल गया। लेकिन जवाब देने के लिए समय निकालने के लिए धन्यवाद। यह ऑनलाइन खोज रहे लोगों के लिए यह बहुमूल्य जानकारी है।
मेरियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.