Magento में सहायक क्या है?


जवाबों:


27

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

उन्हें अंतिम उपाय के रूप में उपयोग करें।

इसके अलावा Magento को अनुवाद के कारणों के लिए प्रत्येक मॉड्यूल के लिए एक सहायक की आवश्यकता है।
आप बस Data.phpप्रत्येक मॉड्यूल में बुलाया एक सहायक बना सकते हैं और इसे खाली छोड़ सकते हैं।


एकमात्र वास्तविक "उपयोग" जो मैंने सहायकों के लिए पाया है, वह यह है कि वे हमेशा एक सिंगलटन होने की गारंटी देते हैं। मैंने कुछ शैक्षिक विरासत कोड पर काम किया है जो foreachलूप के भीतर संग्रह और सभी प्रकार के पागलपन को लोड कर रहा था । मैं एक सहायक को यह भयानक तर्क बाँटे और एक वस्तु कैश के रूप में उपयोग करने के लिए उपयोगी हो सकता है फिर से मिल गया, और भविष्य डेवलपर्स जो गलती से फोन हो सकता है से त्रुटियों के लिए कोई गुंजाइश नहीं छोड़ getModelके बजाय getSingletonअगर मैं एक मॉडल में रखा था।
ल्यूक रॉजर्स

@LukeRodgers। मैं आपकी बात देख रहा हूं, लेकिन मुझे नहीं लगता कि "गलती से कॉल मिल सकती है GetModel के बजाय getSingleton" सहायकों का उपयोग करने के लिए एक वास्तविक कारण के रूप में योग्य है। मैं तर्क दे सकता हूं कि आप "सेव" के बजाय "गलती से" कॉल "डिलीट" कर सकते हैं। इससे बचने के लिए आप क्या सुरक्षा कर सकते हैं? मुझे लगता है कि "ध्यान देना" सॉफ्टवेयर विकास का हिस्सा है।
मेरियस

माना। इन परिदृश्यों में मुझे लगता है कि मैं सिर्फ मानवता के खिलाफ रक्षात्मक रूप से कोड करने की कोशिश कर रहा हूं।
ल्यूक रोडर्स

कोर सहायकों के लिए कस्टम तरीकों को जोड़ने के बारे में आप क्या करेंगे?
tecjam

13

प्रश्न के दो पहलू हैं:

  1. क्या मुझे अपने स्वयं के सहायकों को लिखना चाहिए और क्या करना चाहिए?
  2. क्या मुझे मुख्य सहायकों का उपयोग करना चाहिए और इसके लिए क्या करना चाहिए?

1. सहायक लेखन

सामान्य तौर पर, नाम वाली कक्षाएं Helper, Utilया इसी तरह का कहना है "मेरे पास कुछ कार्य हैं जिन्हें मैं नहीं जानता कि कहां रखा जाए" और एक वर्ग के रूप में बहुत समझ में नहीं आता है।

मैगेंटो सहायकों को सिंगलटन के रूप में प्रस्तुत करता है और अधिकांश कोर हेल्पर्स के पास कोई राज्य नहीं है, इसलिए विधियां कक्षा के बिना staticभी हो सकती हैं functions। यह सब अक्सर एक कोड गंध माना जाता है , एप्लिकेशन डिज़ाइन में एक दोष है।

जैसा कि मारियस ने पहले ही बताया था, आपको अपने स्वयं के कोड के लिए सहायकों का उपयोग करने की आवश्यकता नहीं है। यदि आप मॉड्यूल विशिष्ट अनुवादों का उपयोग करते हैं तो बस प्रति मॉड्यूल एक डिफ़ॉल्ट खाली सहायक बनाएं, अन्यथा वे काम नहीं करेंगे। मॉडल को प्राथमिकता दें (जिसे Mage_Core_Model_Abstractडेटाबेस डेटा का प्रतिनिधित्व नहीं करने पर विस्तार करने की आवश्यकता नहीं है) या स्वतंत्र पुस्तकालय कक्षाएं।

हालाँकि, मैं "सभी में सहायकों का उपयोग नहीं करने" के बारे में बहुत सख्त नहीं होऊंगा और इसके बजाय उन्हें क्वेरी शॉर्टकट के लिए उपयोग करूंगा जैसे:

  • एक्सेस मॉड्यूल कॉन्फ़िगरेशन:

    public function getFooBar() 
    {
        return Mage::getStoreConfig('module/foo/bar');
    }
  • पुस्तकालय वर्गों के लिए कारखाने के तरीके

    public function getNewFooService()
    {
        return new \Foo\Service(...);
    }

आप अन्य स्थानों पर पा सकते हैं लेकिन IMHO, मॉड्यूल सहायक अक्सर ऐसी चीजों के लिए पर्याप्त है।


2. सहायकों का उपयोग करना

मुख्य सहायकों का उपभोग करना कुछ ऐसा है जो आप अक्सर करेंगे।

उदाहरण:

  • __()अनुवाद विधि: किसी विशिष्ट मॉड्यूल का अनुवाद प्राप्त करने के लिए, आपको उपयोग करना चाहिए Mage::helper('module-alias')->__('string to be translated')। यदि आप $this->__(...)टेम्पलेट या ब्लॉक के भीतर उपयोग करते हैं और यदि आप translate="..."XML फ़ाइलों में विशेषता का उपयोग करते हैं तो यह स्पष्ट रूप से होता है
  • Mage::helper('core') विधियाँ: स्थानीयकृत तिथि, मूल्य और मुद्रा तैयार करना, डेटा बचना और इनकोडिंग
  • Mage::helper('tax') कर कॉन्फ़िगरेशन से जानकारी प्राप्त करने और उसके आधार पर कीमतों की गणना करने के तरीके
  • Mage::helper('catalog/image') कैश्ड और रिसाइज्ड कैटलॉग इमेज बनाने और उनके URL को पुनः प्राप्त करने के लिए एक इंटरफ़ेस प्रदान करता है
  • Mage::helper('catalog/product_url_rewrite')->joinTableToSelect() एक उत्पाद संग्रह क्वेरी के लिए URL फिर से लिखना तालिका में शामिल होता है।

कोर हेल्पर्स में कई और (अधिक या कम) उपयोगी कार्य छिपे हुए हैं, यदि आपको एक विशिष्ट कार्यक्षमता की आवश्यकता है जो कि कोर में कहीं इस्तेमाल होने की संभावना है, तो जांचें कि क्या आप किसी सहायक विधि का पुन: उपयोग कर सकते हैं।

आमतौर पर ये मददगार स्टेटलेस ऑब्जेक्ट होते हैं और तरीके क्वेरी तरीके होते हैं (यानी इनका कोई साइड इफेक्ट नहीं होता)

लेकिन हमेशा की तरह Magento अपने अलिखित नियमों को तोड़ता है और इसे एक उदाहरण के रूप में नहीं लिया जाना चाहिए। एक "अच्छा" उदाहरण है कि सहायकों का उपयोग कैसे नहीं Mage_Catalog_Helper_Product_Compareकिया जाता है, जिसमें एक $_itemCollectionसंपत्ति होती है जिसे केवल एक बार शुरू किया जा सकता है और एक $_customerIdसंपत्ति जिसे एक सेटर के साथ बदला जा सकता है। आपको कैटलॉग से संबंधित कुछ और मददगार मिलेंगे जो संलग्न संग्रहों के साथ हैं। कोड के लिए परीक्षण लिखना जो उनका उपयोग करता है या उन्हें अलग-अलग संदर्भों में फिर से उपयोग करता है, मजेदार नहीं है, इसलिए कृपया घर पर ऐसा न करें।

catalog/imageसहायक ऊपर उल्लेख किया है एक सहायक है कि वास्तव में एक सहायक नहीं होना चाहिए का एक और उदाहरण है। आप के साथ एक उत्पाद उत्तीर्ण करने की आवश्यकता init()है तो आप (जैसे विभिन्न पैरामीटर सेट जो अपनी वर्तमान स्थिति को रीसेट करता है पहले resize(), setQuality()) और अंत में आप अपने साथ URL प्राप्त कर सकते __toString()विधि। यह अच्छा लगता है जब एक टेम्पलेट में उपयोग किया जाता है, लेकिन कोड एक बड़ी गड़बड़ है और यह एक सिंगलटन के रूप में समझ में नहीं आता है।


टी एल; डॉ:

  • मुख्य सहायकों में उपयोगी उपकरण होते हैं।
  • आपको अनुवाद के लिए सहायकों की आवश्यकता है
  • सहायकों को स्टेटलेस होना चाहिए
  • अपने स्वयं के मॉड्यूल में, असिस्टेड फ़ंक्शन संग्रह के रूप में सहायकों का उपयोग करने से बचें। ज्यादातर मामलों में आप अधिक उपयुक्त स्थान पा सकते हैं

मैंने अक्सर फ्लैट फ़ाइलों के आधार पर सरल ईआरपी एकीकरण में सहायकों का उपयोग किया है। वे सब करते हैं और स्थानीय निर्देशिकाओं से फाइल लिखते और पढ़ते हैं और अन्य वस्तुओं (उत्पाद, ऑर्डर, आदि) को अपडेट करते हैं। उनके पास उल्लेखित उदाहरणों में अपने स्वयं के राज्य या संबंधित टेबल नहीं हैं। इस पर आपका क्या ख्याल है?
म्यूज़िकलिफ्ट्समे जुमे 21'15

1
जो "कोई दुष्प्रभाव नहीं" का उल्लंघन करता है। पढ़ने और लिखने के फ़ाइलें हैं पर मेरे हमेशा की तरह ले Readerऔर Writerमॉडल, कि वास्तव में ऐसा राज्य (कम से कम एक फ़ाइल संसाधन) है। उदाहरण के लिए, CSV फ़ाइल से ऑर्डर स्थिति डेटा पढ़ने के लिए, मेरे पास sth होगा। एक OrderStatusCsvReaderमॉडल है कि एक OrderStatusUpdaterमॉडल द्वारा प्रयोग किया जाता है पसंद है । इस तरह मैंने चिंताओं को "फ़ाइल से डेटा पढ़ें" और "
मैगेंटो

4

मारियस सही है। मुझे लगता है कि मददगार बकवास हैं।

लेकिन Magento के सिद्धांत में आपको सहायकों में सब कुछ डाल देना चाहिए जो किसी वस्तु की स्थिति को नहीं बदलता है, उदाहरण के लिए स्वरूपित मूल्य प्राप्त करें।

लेकिन सब कुछ आप एक सहायक में डाल सकते हैं, आप एक मॉडल में भी डाल सकते हैं। और आप एक मॉडल के विभिन्न उदाहरण प्राप्त कर सकते हैं, जो परीक्षण के लिए सहायक है।


2

मैं Magento के लिए काफी नया हूँ, लेकिन मेरे लिए ऐसा लगता है कि एक हेल्पर Magento की सेवा के समकक्ष है : "संबंधित सॉफ़्टवेयर फ़ंक्शंस का एक सेट जिसे विभिन्न प्रयोजनों के लिए पुन: उपयोग किया जा सकता है"। एक मॉड्यूल सेवाओं के माध्यम से अपनी पेशकश की कार्यक्षमता का निर्यात करता है। उन कार्यों के लिए एक सहायक का उपयोग करें जिन्हें आप उपयोग करने के लिए अन्य मॉड्यूल को आमंत्रित करते हैं।

एक मॉडल को केवल ऐसी विधियाँ प्रदान करनी चाहिए जो किसी वस्तु की अवस्था को प्राप्त करने या स्थापित करने से सीधे संबंधित हों, या जो अन्यथा मॉडल की तात्कालिक वस्तु से जुड़ी हों।


1

डुप्लिकेट किए गए कोड (मॉडल, टेम्प्लेट, ...) में रोकथाम के लिए मदद मिलती है और कुछ समय के लिए वे आवश्यक हैं।

  • यदि आप कस्टम मॉड्यूल सक्षम है, तो आप Mage::getStoreConfigFlag('my/module/enabled')हर फ़ाइल की तरह कुछ जगह रख सकते हैं जहाँ आप यह जाँचना चाहते हैं, या आप Mage::helper('my_module')->isEnabled()लाभ के साथ उपयोग करते हैं:
    • यदि किसी कारण से कॉन्फिगर पथ में परिवर्तन होता है, तो आपको बस एक फ़ाइल को समायोजित करना होगा
    • आप सहायकों की isEnabled()विधि को फिर से लिख सकते हैं और यह कई फाइलों को फिर से लिखने के बजाय इसका उपयोग करने वाले सभी वर्गों को प्रभावित करेगा
  • 13 @ @ कस्टम एक्सटेंशन कैसे लिखें? : जब तक आवश्यक न हो, कक्षाओं को फिर से न लिखें। पर्यवेक्षकों का उपयोग करें और यदि यह सहायक विधियों का उपयोग करना संभव नहीं है जो उस वर्ग के पैरामीटर और उदाहरण के रूप में प्राप्त करते हैं जिसे आप ओवरराइड करना चाहते थे। गलत:Mage_Catalog_Model_Product विधि जोड़ने के लिए ओवरराइड करें getProductArticles()सही है । अपने सहायक जोड़ मेंgetProductArticles(Mage_Catalog_Model_Product $product)
  • लेआउट अपडेट को अधिक लचीला उपयोग करें <action method="someMethod"><var helper="module/method" /></action>

आप बस Data.phpप्रत्येक मॉड्यूल में बुलाया एक सहायक बना सकते हैं और इसे खाली छोड़ सकते हैं

PHPUnit का उपयोग करते समय आपको एक सिंगल लाइन जोड़ना चाहिए :protected $_moduleName = 'My_Module';

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