Magento 2 में तत्काल सहायक


26

Magento 2 के नवीनतम बिल्ड ने Mageकक्षा के साथ दूर किया है । इसका मतलब है कि हमने Mage::helperविधि खो दी है।

क्या मैगेंटो 2 में मदद करने वालों के लिए एक प्रतिस्थापन तकनीक (सहायक कारखाना?) है? या हम नए ऑब्जेक्ट मैनेजर क्लास का उपयोग करने की उम्मीद कर रहे हैं, और बस get(बनाम create) के साथ एक सिंगलटन / कैश्ड ऑब्जेक्ट के रूप में सहायक को तुरंत हटा दें

जवाबों:


31

मैं देखता हूं कि आप सही समाधान के लिए आए थे, बस संक्षेप में बताना चाहते हैं।

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

class SomeClass
{
    public function __construct(\Magento\Core\Helper\Data $helper)
    {
        $this->helper = $helper;
    }

    public function doSmth()
    {
        $this->helper->someMethod();
    }
}

ध्यान दें कि किसी भी phpDoc टिप्पणियों की आवश्यकता नहीं है, मैगेंटो सीधे निर्माता के हस्ताक्षर पढ़ेगा ताकि यह पता लगाया जा सके कि क्या निर्भरताएं आवश्यक हैं।

\ _ Magento \ Core \ Helper \ Factory का उपयोग केवल उन दुर्लभ मामलों में किया जाना चाहिए जब आपको बहुत सारे हेल्पर्स को कॉल करना होगा, या आपको ठीक से नहीं पता होगा कि आपको किसकी आवश्यकता है।

ऑब्जेक्ट प्रबंधक का उपयोग सीधे कड़ाई से हतोत्साहित किया जाता है । तो कृपया उपयोग करने से बचें:

\Magento\Core\Model\ObjectManager::getInstance()

यह केवल सीरियलाइजेशन / डिसरियलाइजेशन के लिए है।


स्थिर का उपयोग न करें क्योंकि यह PHP इकाई के साथ परीक्षण नहीं किया जा सकता है और हाँ इसे हतोत्साहित किया जाता है। सभी एम 2 निर्भरताएं कंस्ट्रक्टर के माध्यम से की जाती हैं, और ऑब्जेक्ट मैनेजर द्वारा आंतरिक रूप से प्रबंधित की जाती हैं, और इसे सिंगलटन के रूप में पुनः प्राप्त करेंगे, साथ ही प्रॉपर्टी विजिबिलिटी को इंगित करने के लिए _ का उपयोग नहीं करते हैं, सभी एम 2 नामकरण को कैमकेस का उपयोग करना चाहिए
पार्टीसॉफ्ट जूल

@ एटन क्रिल अगर हम helperटेम्पलेट में उपयोग करते हैं , जैसे $this->helper('Magento\Catalog\Helper\Image'), यह सबसे अच्छा अभ्यास है?
खोआ TruongDinh

2
नहीं, यह नहीं है। टेम्पलेट केवल संदर्भ ब्लॉक होना चाहिए। सहायकों से बचा जाना चाहिए
एंटोन क्रिल

10

यह ऑब्जेक्ट के कंस्ट्रक्टर के माध्यम से ऑब्जेक्ट में मददगार और मॉडल प्राप्त करने के लिए अपने नए स्वचालित निर्भरता इंजेक्शन सिस्टम का उपयोग करने के लिए मैगेंटो के उत्साहवर्धक लोगों की तरह दिखता है ।

लघु संस्करण? यदि आपके पास ऑब्जेक्ट है जो ऑब्जेक्ट मैनेजर द्वारा तुरंत तैयार किया गया है, और एक निर्माता को PHPDoc के साथ सजाता है@param , और पैरामीटर में एक उचित प्रकार का संकेत सेट है, तो ऑब्जेक्ट मैनेजर आपके लिए सहायक (या, मुझे विश्वास है, अन्य ऑब्जेक्ट) को तुरंत स्वचालित करेगा।

उदाहरण के लिए, निम्नलिखित कंस्ट्रक्टर ऑब्जेक्ट में आ कोर डेटा हेल्पर को इंजेक्ट करेगा।

/**
* @param \Magento\Core\Helper\Data $coreData
*/        
public function __construct(\Magento\Core\Helper\Data $coreData)
{
    $this->_coreHelper = $coreData;            
}

यह सही उत्तर है - महान खोजी; बहुत खुदाई के बाद भी मेरे लिए पूरी तरह से स्पष्ट नहीं था।
फिलिंक

2
ठीक है ... अब मेरा सिर दर्द करता है ... बहुत कुछ। आपका मतलब है कि हम PHPDoc का उपयोग "कोड" लिखने वाले हैं? यह पागलपन है। मैं छोड़ता हूं।
मारीस

@ मार्स हाहा यह असामान्य नहीं है - एलन का ब्लॉग इसे कुछ हद तक समझाता है।
फिल्विंकल

3
@philwinkle। मैंने उनका लेख पढ़ा है। बहुत दिलचस्प है, लेकिन मैं अभी भी कहता हूं कि यह पागलपन है। मुझे पुराने ढंग से बुलाओ, लेकिन "मेरे दिनों में वापस" कोड था और टिप्पणियां ऐसी चीजें थीं जो लगभग किसी ने लिखने की जहमत नहीं उठाई।
मारियस

ओह, और ऐसा है कि। +1। अच्छा सवाल और अच्छा जवाब।
मारियस

7

उपरोक्त सभी उत्तरों के अलावा, यदि आपको phtml टेम्पलेट में सहायक का उपयोग करना है, तो आप बस इस तरह कर सकते हैं:

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

मुझे आशा है कि यह उपयोगी है अगर कोई इसे पहले नहीं जानता था;)


6

जिस तरह से सहायकों को तत्काल मदद मिलती है (कम से कम नए बैकेंड (~ डे 50) मॉड्यूल के लिए) एक सहायक एप्लिकेशन के माध्यम से होते हैं:

/**
 * Return helper object
 *
 * @param string $name
 * @return \Magento\Core\Helper\AbstractHelper
 */
public function helper($name)
{
    return $this->_helperFactory->get($name);
}

जो अनिवार्य रूप से सिर्फ एक विशेष प्रकार का मॉडल कारखाना है। जैसे: निर्माता के हिस्से के रूप में Magento \ Core \ Block \ Context लाइन 143 (dev50):

\Magento\Core\Model\Factory\Helper $helperFactory

सहायक कारखाना वर्ग के नाम के आधार पर अनुरोधित मॉडल लौटाएगा और यह सुनिश्चित करेगा कि यह instanceofसहायक सहायक वर्ग है:

/**
 * Get helper singleton
 *
 * @param string $className
 * @param array $arguments
 * @return \Magento\Core\Helper\AbstractHelper
 * @throws \LogicException
 */
public function get($className, array $arguments = array())
{
    $className = str_replace('_', '\\', $className);
    /* Default helper class for a module */
    if (strpos($className, '\Helper\\') === false) {
        $className .= '\Helper\Data';
    }

    $helper = $this->_objectManager->get($className, $arguments);

    if (false === ($helper instanceof \Magento\Core\Helper\AbstractHelper)) {
        throw new \LogicException(
            $className . ' doesn\'t extends Magento\App\Helper'
        );
    }

    return $helper;
}

यदि आप इसे स्वयं कार्यान्वित करते हैं तो ऐसा लगता है कि Magento कोर इसे दो तरीकों में से एक में लोड कर रहा है:

अपनी खुद की फैक्टरी रोल:

$objectManager = \Magento\Core\Model\ObjectManager::getInstance();

$helperFactory = $objectManager->get('\Magento\Core\Model\Factory\Helper');
$helper = $helperFactory->get('\PulseStorm\Commercebug\Helper\Data');

या सीधे इसे पकड़ो:

$helper = \Magento\Core\Model\ObjectManager::getInstance()->get('Magento\Core\Helper\Data');

1
उपयोगी जानकारी के लिए +1, लेकिन क्या आप कारखाने को सीधे उस तरह से इंस्टेंट करना चाहेंगे? या ऑब्जेक्ट प्रबंधक के साथ एक कैश्ड वर्ग के साथ एक ही सहायक कारखाने को तत्काल चालू किया जाना चाहिए get?
एलन स्टॉर्म

यह पूरी तरह से स्पष्ट नहीं है, क्योंकि सहायक कारखाना \ Mage \ Core \ Block \ Abstract से विरासत में मिला है - मुझे लगता है कि इरादा आपका अपना सहायक कारखाना है। ऐसा नहीं लगता है कि वे जानबूझकर कारखाने के लिए एक सिंगलटन बना रहे हैं, हालांकि।
philwinkle

लगता है जैसे मुझे ज़रूरत है / सबसे अच्छा स्रोत यह पता लगाने के लिए है कि _helperFactory उन वस्तुओं में कैसे इंजेक्ट किया जाता है और देखें कि कोर टीम इसे कैसे रोकती है।
एलन स्टॉर्म

मेरे सरलीकरण सारांश गलत है और साथ ही निर्माता को ObjectManager के उदाहरण की आवश्यकता है। मैं पल-पल संपादित करूंगा।
फिल्हाल

संपादित देखें। यह काम करना चाहिए - इस समय यह निर्धारित करना मुश्किल है क्योंकि मेरी क्ली शेल वातावरण स्टोर कॉन्फ़िगरेशन आवृत्ति को अपेक्षा के अनुसार लोड नहीं कर रहा है। यह आपको सही रास्ते पर लाने के लिए पर्याप्त होना चाहिए, हालाँकि।
17

0

इस तरह आजमाएं

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');

ऑब्जेक्ट मैनेजर का उपयोग सीधे सख्ती से हतोत्साहित किया जाता है।
sv3n

@ sv3n कृपया बता सकते हैं, क्या कारण है? धन्यवाद।
तुषान

1
इसके बजाय बेहतर उपयोग निर्भरता इंजेक्शन ... उदाहरण के लिए यहाँ उत्तर दिया ... magento.stackexchange.com/questions/142352/…
sv3n
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.