एक Magento 2 CRUD / सार मॉडल में निर्भरता इंजेक्षन


12

क्या Magento 2 CRUD मॉडल में निर्भरता को इंजेक्ट करना संभव है?

वह है - Magento 2 में एक आधार सार मॉडल वर्ग है Magento\Framework\Model\AbstractModel:। यदि आप एक सिंपल क्रिएट, रीड, अपडेट, डिलीट मॉडल ऑब्जेक्ट बनाना चाहते हैं, तो आप इस क्लास को अपनी क्लास के साथ बढ़ाएँ।

class Foo extends Magento\Framework\Model\AbstractModel
{
}

क्या आपके मॉडल की __constructविधि में निर्भरता को इंजेक्ट करना संभव है ? जब मैं कोशिश करता हूं, तो मैं निम्नलिखित त्रुटि प्राप्त करता हूं।

घातक त्रुटि: अमूर्त वर्ग मैगनेटो \ फ्रेमवर्क \ मॉडल \ रिसोर्समॉडल \ एब्सट्रैक्ट को तत्काल नहीं कर सकता

अपराधी प्रतीत हो रहा है AbstractModelकी __constructविधि।

public function __construct(
    \Magento\Framework\Model\Context $context,
    \Magento\Framework\Registry $registry,
    \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
    \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
    array $data = []
) {

इस कंस्ट्रक्टर ( Magento\Framework\Model\ResourceModel\AbstractResource, Magento\Framework\Data\Collection\AbstractDb) में दो प्रकार के संकेत हैं जो मैगेंटो ऑब्जेक्ट मैनेजर इंटरफेस नहीं हैं। वे अमूर्त वर्ग हैं। जब मैं इस वर्ग का विस्तार करता हूं और अपने इंजेक्शन की निर्भरता को जोड़ने का प्रयास करता हूं

class Foo extends Magento\Framework\Model\AbstractModel
{
    public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = [],
        \Package\Module\Model\Mine $mine,

    ) {
        //...
        parent::__construct($context, $registry, $resource, $resourceCollection, $data);

    }
}

Magento की घंटी तब बजती है जब ऑब्जेक्ट मैनेजर अमूर्त कक्षाओं को तुरंत करने की कोशिश करता है।

मैं अपनी वस्तु निर्भरता को अमूर्त वर्गों के सामने ले जाकर इसे "ठीक" कर सकता हूं

    public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,

        \Package\Module\Model\Mine $mine,

        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = [],
    ) {  

हालाँकि, इसने तर्क क्रम को बदल दिया। पूरी तरह से ऑब्जेक्ट प्रबंधित किए गए एक वर्ग में, यह एक समस्या नहीं होगी। हालाँकि, तथ्य यह है कि ये अमूर्त वर्ग प्रकार संकेत मौजूद हैं कि Magento सिस्टम के कुछ हिस्से हैं जो मैन्युअल रूप से (ऑब्जेक्ट प्रबंधक या DI के माध्यम से नहीं) CRUD ऑब्जेक्ट्स को इंस्टेंट करते हैं और उन ऑब्जेक्ट्स में पास होते हैं जो उस विशिष्ट क्रम में टाइप संकेत के अनुरूप होते हैं ।

क्या यह सुरक्षित है? एक सार मॉडल के निर्माता में इन अमूर्त कक्षाएं सिर्फ विरासत कोड हैं, और इसका उपयोग नहीं किया गया है? या सिस्टम के हिस्से अभी भी इनका उपयोग करते हैं, जिसका अर्थ है कि सीआरयूडी मॉडल में निर्भरता को इंजेक्ट करना संभव नहीं है?

जवाबों:


9

सबसे पहले निर्माणकर्ता वर्ग की निजी एपीआई है। कंस्ट्रक्टर फ़ंक्शन का विशेष अर्थ है और इसके लिए माता-पिता की कक्षा में तर्क की समान सूची / आदेश की आवश्यकता नहीं है।

क्या Magento 2 CRUD मॉडल में निर्भरता को इंजेक्ट करना संभव है?

हां बिल्कुल।

क्या यह सुरक्षित है?

हां, लेकिन Magento के ऑब्जेक्ट मैनेजर का मानना ​​है कि सभी वैकल्पिक मापदंडों को सूची के अंत में रखा गया है और वैकल्पिक पैरामीटर हल नहीं किए जाएंगे।

$ संसाधन, $ रिसोर्सकॉल्यूशन तर्क विरासत है लेकिन अभी भी मॉडल कक्षाओं में व्यापक रूप से उपयोग किया जाता है। अधिकांश मॉडल संसाधन और संग्रह वर्ग को आरंभ करने के लिए इस तरह कोड का उपयोग करते हैं।

protected function _construct() { 
    $this->_init('Magento\AdminNotification\Model\Resource Model\Inbox'); 
}

यही कारण है कि यह पैरामीटर वैकल्पिक है। लेकिन, उदाहरण के लिए, यूनिट टेस्ट में हम रीस्ट्रक्चर को बदलने के लिए संसाधन या संग्रह नकली का निर्माण करते हैं।


@ कांडे ने मैगेंटो के इंजीनियरिंग / आर्किटेक्चर विभाग ने कभी सार्वजनिक बयान दिया कि कोर कक्षाओं के लिए कंस्ट्रक्टर ऑर्डर अप्रासंगिक है? या यह कि इस पर काम करने वाले ज्यादातर लोगों की उम्मीद है?
एलन स्टॉर्म

मैं इसे "अप्रासंगिक" नहीं कहूंगा। बस OM आपके कंस्ट्रक्टर के लिए आवश्यक दलीलें पास करेगा और यह पैरेंट क्लास के ऑर्डर पर निर्भर नहीं करता है। इसके अलावा, मापदंडों के नामों का उपयोग करें, इसलिए अब इसे बदलना बेहतर नहीं है (यह php भाषा से अलग है, जहां आप मापदंडों के नाम बदल सकते हैं जैसे आप चाहते हैं)
Kndy

मुझे यकीन नहीं है कि मैं समझ रहा हूं कि आप क्या कह रहे हैं। क्या आप कह रहे हैं कि, भविष्य में कुछ बिंदु पर, कोर Magento सिस्टम कोड तर्क / पैरामीटर ऑर्डर को फिर से महत्वपूर्ण मान सकता है?
एलन स्टॉर्म

मेरा मानना ​​है कि नहीं
कांदी

एक बार फिर धन्यवाद! एफडब्ल्यूआईडब्ल्यू, और गोगलर्स के लिए, ऐसा लगता है कि यह एक सुरक्षित चीज होनी चाहिए। क्या मैं बता सकता है कि कोई Magento सिस्टम कोड नहीं है जो कंस्ट्रक्टर पैरामीटर ऑर्डर मानने वाले मॉडल को स्वचालित रूप से अंधा कर देता है।
एलन स्टॉर्म

6

यह सुरक्षित प्रतीत होता है। कम से कम, Magento यह कई स्थानों पर कर रहा है। उदाहरणों के लिए कक्षाओं की निम्न (गैर अनन्य) सूची में __construct विधियां देखें

  • \ Magento \ थीम \ मॉडल \ थीम \ फ़ाइल
  • \ Magento \ थीम \ मॉडल \ डिजाइन
  • \ Magento \ बिक्री \ मॉडल \ आदेश \ क्रेडिट मेमो

दुर्भाग्य से, मैं आपके प्रश्न के दूसरे भाग का उत्तर नहीं दे सकता।


4
  1. आप अपने मॉडल का उपयोग कैसे करते हैं?
  2. आपके मामले में $mineएक है की आवश्यकता है, जबकि, पैरामीटर $resource, $resourceCollectionऔर $dataकर रहे हैं वैकल्पिक । वैकल्पिक मापदंडों को हमेशा अंतिम होना चाहिए, अन्यथा वैकल्पिक रूप से उनके साथ काम करना असंभव है। इसलिए यह मेरे लिए ठीक है कि आपको $mineकिसी भी वैकल्पिक पैरामीटर से पहले निर्दिष्ट करना चाहिए ।

सिवाय उन एब्सट्रैक्ट पैरामीटर्स पर निर्भरता के इंजेक्ट किए गए पैरामीटर्स नहीं हैं, और अगर मैगेंटो कोर सिस्टम कोड को उम्मीद $mineहै कि कतार के सामने की ओर बढ़ने से उनमें त्रुटियाँ पैदा होंगी। यदि Magento के कोर सिस्टम कोड का उपयोग नहीं करता है तो वे वहां क्यों हैं? यही सवाल मैं नीचे करने के लिए कोशिश कर रहा हूँ। सिर्फ इसलिए कि मैं स्थानांतरित किए गए पैरामीटर के साथ अपने मॉडल का उपयोग करने में सक्षम हूं, यह सुरक्षित नहीं है।
एलन स्टॉर्म

कुछ मॉडल अभी भी कस्टम संसाधन मॉडल को पारित करने के लिए इन वैकल्पिक मापदंडों का उपयोग कर सकते हैं। उदाहरण के लिए, github.com/magento/magento2/blob/develop/app/code/Magento/…
BuskaMuza

Magento यह निर्धारित करने के लिए प्रतिबिंब का उपयोग करता है कि पैरामीटर वैकल्पिक है या नहीं। और PHP आवश्यक के रूप में आवश्यक पैरामीटर से पहले खड़े सभी मापदंडों पर विचार करता है । इसलिए, यदि आप $mineवैकल्पिक मापदंडों से पहले चलते हैं, तो वे वास्तव में वैकल्पिक हो जाते हैं और Magento बस डिफ़ॉल्ट मान ( null, array()) पास करता है। यदि आप वैकल्पिक लोगों के बाद एक आवश्यक पैरामीटर रखते हैं, तो PHP वैकल्पिक मापदंडों को आवश्यक मानता है और Magento ने उन्हें तुरंत हटाने की कोशिश की (लेकिन उनके लिए कोई प्राथमिकता नहीं है)।
बुस्कामुज़ा

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