DI और Magento 2 पर एक ब्लॉक का विस्तार


15

मुझे लगता है कि मैं Magento 2 पर निर्भरता इंजेक्शन को ब्लॉक के साथ समझने के लिए संघर्ष कर रहा हूं, हर बार मैं एक ऐसे ब्लॉक का विस्तार करने की कोशिश करता हूं जो \ Magento \ फ्रेमवर्क \ View \ Element \ टेम्पलेट नहीं है मैं त्रुटियों के साथ समाप्त होता हूं।

मैं एक ऐसा ब्लॉक बनाना चाहता हूं जो Magento के \ N \ Theme \ Block \ Html \ Header \ Logo के बहुत ही मूल वर्ग का विस्तार करता है - जब तक मैं निर्माण विधि के भीतर निर्भरता इंजेक्शन की कोशिश नहीं करता, तब तक सब कुछ ठीक रहता है:

<?php

namespace Creare\Test\Block\Header;

class Logo extends \Magento\Theme\Block\Html\Header\Logo
{

    protected $_creareHelper;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Creare\Seo\Helper\Data $creareHelper,
        array $data = []
    )
    {
        $this->_creareHelper = $creareHelper;
        parent::__construct($context, $data);
    }
}

जैसे ही मैं अपने सहायक वर्ग (या उस मामले के लिए कुछ और) को इंजेक्ट करने की कोशिश करता हूं, मुझे एक स्टैक ट्रेस मिलता है जो निम्न त्रुटि से शुरू होता है:

Recoverable Error: Argument 2 passed to Magento\Theme\Block\Html\Header\Logo::__construct() must be an instance of Magento\MediaStorage\Helper\File\Storage\Database, array given, called in /Users/adammoss/PhpstormProjects/Magento2/app/code/Creare/Test/Block/Header/Logo.php on line 17 and defined in /Users/adammoss/PhpstormProjects/Magento2/app/code/Magento/Theme/Block/Html/Header/Logo.php on line 33

यदि मैं अपने __construct में उसी निर्भरता को जोड़ता हूं जिस फ़ाइल से मैं इसे काम कर रहा हूं, लेकिन निश्चित रूप से यह चीजों को करने का एक पिछड़ा तरीका है क्योंकि वर्गीय विरासत की बात यह है कि मैं माता-पिता के सभी तरीकों और गुणों को अवशोषित करता हूं?

मुझे लगता है कि मुझे बस कक्षाओं से किसी को निकालने और मैगेंटो के साथ DI का उपयोग करने के लिए किसी मूल 101 स्पष्टीकरण की आवश्यकता है। किसी भी मदद की बहुत सराहना की!


"निश्चित रूप से यह काम करने का एक पिछड़ा तरीका है" सहमत।
जेम्स

जवाबों:


19

आप जिस वर्ग का विस्तार करने का प्रयास कर रहे हैं, उसमें यह निर्माता है:

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageHelper,
    array $data = []
) {
    $this->_fileStorageHelper = $fileStorageHelper;
    parent::__construct($context, $data);
}

इसलिए आपको अपने कंस्ट्रक्टर को इस तरह बनाना होगा

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageHelper,
    \Creare\Seo\Helper\Data $creareHelper,
    array $data = []
)
{
    $this->_creareHelper = $creareHelper;
    parent::__construct($context, $fileStorageHelper, $data);
}

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


2
यह आपके उत्तर के लिए समझदारी का धन्यवाद करता है। मुझे लगता है कि मैं उम्मीद कर रहा था कि यह उससे अधिक सुरुचिपूर्ण था।
एडम मॉस

@ दलीलों के क्रम को माता-पिता के वर्ग के तर्क के समान होने की आवश्यकता होती है, आपके कस्टम तर्कों को अंत में पास होने की आवश्यकता होती है।
चिराग़ दोडिया

@chiragdodia क्यों? मुझे ऐसा नहीं लगता। सब कुछ मैं M2 पर अब तक बनाया मैं कस्टम निर्माण तर्क का उपयोग कर बेतरतीब ढंग से जोड़ा गया। और इसने काम किया। एकमात्र बाधा यह है कि एक डिफ़ॉल्ट मान के साथ तर्क अंतिम होना चाहिए।
मेरियस

@ मेरा हाँ कुछ मामलों में काम कर रहा है, लेकिन मेरे मामले में जब मेरे पास \ Magento \ कैटलॉग \ Block \ Product \ विस्तारण है, तो काम नहीं कर रहा हूँ मुझे मूल निर्माता के रूप में तर्कों के समान क्रम बनाने की आवश्यकता है और अंतिम में कस्टम तर्क जोड़े। मेरे कोड पर एक नज़र डालें यहां magento.stackexchange.com/questions/95697/…
चिराग़ दोडिया

यह मेरे लिए काम नहीं कर रहा है जब मैंने \ Magento \ Customer \ Block \ Form \ Register ब्लॉक को ओवरराइड करने की कोशिश की
DEEP JOSHI
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.