Magento2 में __construct और _construct क्या है?


21

Magento 2 में, अधिकांश कक्षाओं में ये दो निर्माण ( __constructऔर _construct) विधियां हैं। उनके बीच क्या अंतर है?

जवाबों:


17

मुझे पूरी तरह से यकीन नहीं है कि अगर यह Magento 1 और Magento 2 के बीच बदल गया है, तो शायद मैं मैजेंटो 1 से जो कुछ भी जानता हूं उसके साथ नहीं जाऊंगा।

के _constructबाद बुलाया जाएगा__construct

PHP देशी __constructविधि को आपके कोड में अधिलेखित या उपयोग नहीं किया जाना चाहिए। यदि आप एक वर्ग उपयोग की शुरुआत पर सुरक्षित तरीके से कोड निष्पादित करना चाहते हैं _construct

Magento __constructयह सुनिश्चित करने के लिए देशी का उपयोग करेगा कि एक वर्ग के लिए सब कुछ 'तैयार' है जैसे कि एक निश्चित मॉडल के लिए सही कैश टैग को परिभाषित करने के लिए उपयोग किया जाना चाहिए।


15

_Construct विधि एक था "Varien आविष्कार" मॉडल, सहायकों और ब्लॉकों में कुछ आरंभीकरण तर्क रैप करने के लिए इस्तेमाल किया।

इसलिए एम 1 मॉडल / ब्लॉक या हेल्पर्स में मूल __construct () विधि को बदलना या फिर से घोषित करना असामान्य है क्योंकि हम हमेशा मैगेंटो कारखानों का उपयोग करते हैं। हालांकि इसका उपयोग करने के बारे में कोई समस्या / बुरा-व्यवहार नहीं है (यदि आप संगतता का ध्यान रखते हैं)।

M2 में _construct () विधि अभी भी कुछ हिस्सों में मौजूद है और समान उद्देश्यों के लिए उपयोग की जाती है, लेकिन अब (M2 में) सभी DI तर्क __constructor () द्वारा कार्यान्वित किए जाते हैं, इसलिए आपको कोड बेस में बहुत सारी निर्माण घोषणाएं मिलेंगी।

बीटीडब्लू Mage::getModel()में एम 2 की तरह अधिक फैक्ट्रियां नहीं हैं ।

दूसरे शब्दों में:

_Construct () विधि कुछ कक्षाओं में Magento द्वारा कार्यान्वित किया जाता है और इसके अंदर स्वचालित रूप से कहा जाता है __construct समारोह घोषणा, इसलिए यदि आप आप वस्तु निर्माण के बाद कुछ सामान प्रदर्शन करने के लिए उपयोग कर सकते हैं एक मॉडल की तरह एक Magento वर्ग का विस्तार कर रहे हैं।

संसाधन मॉडल या मॉडल क्लास में आपको _construct()तालिका और प्राथमिक_की परिभाषा देने के लिए एक विधि निर्धारित करनी चाहिए

दूसरी ओर __construct PHP की एक मूल विधि है (सभी OO भाषाओं में एक है), __constructहर बार जब आप किसी ऑब्जेक्ट को तुरंत कहते हैं। बस इतना ही

उदाहरण:

Magento \ फ्रेमवर्क \ मॉडल \ ResourceModel \ AbstractResource

/**
 * Abstract resource model
 */
abstract class AbstractResource
{
    /**
     * Main constructor
     */
    public function __construct()
    {
        /**
         * Please override this one instead of overriding real __construct constructor
         */
        $this->_construct();
    } ...

Magento \ फ्रेमवर्क \ मॉडल \ ResourceModel \ Db \ AbstractDb

/**
 * Class constructor
 *
 * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
 * @param string $connectionName
 */
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
    $this->transactionManager = $context->getTransactionManager();
    $this->_resources = $context->getResources();
    $this->objectRelationProcessor = $context->getObjectRelationProcessor();
    if ($connectionName !== null) {
        $this->connectionName = $connectionName;
    }
    parent::__construct();
}

क्या आप कृपया उदाहरण दे सकते हैं?
ज़ेड ब्लैकबर्ड

एम 2 में? मैं अंतर को और अधिक स्पष्ट करने के लिए उत्तर में सुधार कर सकता हूं, लेकिन मुझे नहीं पता कि क्या एक उदाहरण की आवश्यकता है,
मौरोनिग्रेले

मुझे DI और __construct () से संबंधित कुछ चीजों पर आपकी राय में दिलचस्पी है। लगता है कि Magento2 में तथाकथित "DI तर्क" को एंटी-पैटर्न के रूप में लागू किया गया है, क्योंकि यह वास्तव में तंग युग्मन बनाता है। एक संगीतकार अद्यतन चलाना, आपके मॉड्यूल के साथ आपने कितने 3 डी पार्टी मॉड्यूल का उपयोग किया है, इस पर निर्भर करते हुए, अक्सर डिबग करने की आवश्यकता हो सकती है, कंस्ट्रक्टरों में परमेस जोड़ सकते हैं, जो कि वास्तव में बच्चे-कक्षाओं में उपयोग नहीं किए जाते हैं, बस एप्लिकेशन को चालू रखने के लिए। यकीन नहीं है कि इसे "डिपेंडेंसी इंजेक्शन" भी कहा जाना चाहिए, लेकिन निर्भरता एंकरिंग या कुछ और ...
someGuyOnTheWeb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.