जवाबों:
सैद्धांतिक रूप से आपको कभी भी सहायकों का उपयोग नहीं करना चाहिए।
सहायकों को असंबंधित तरीकों का सिर्फ संग्रह है और हमेशा एक एकल के रूप में त्वरित किया जाता है।
यह मूल रूप से कुछ नामस्थान (इस मामले में वर्ग नाम) के तहत रखे गए कार्यों के साथ प्रक्रियात्मक प्रोग्रामिंग है। लेकिन चूंकि मैगेंटो के पास कोर में हेल्पर्स हैं, इसलिए आप अपने तरीकों को वहां रख सकते हैं कि आपको पता नहीं है कि उन्हें कहां रखा जाए या अगर आपको बहुत सारे अलग-अलग स्थानों (मॉडल, कंट्रोलर, टेम्प्लेट) में उन्हें कॉल करना है
उन्हें अंतिम उपाय के रूप में उपयोग करें।
इसके अलावा Magento को अनुवाद के कारणों के लिए प्रत्येक मॉड्यूल के लिए एक सहायक की आवश्यकता है।
आप बस Data.php
प्रत्येक मॉड्यूल में बुलाया एक सहायक बना सकते हैं और इसे खाली छोड़ सकते हैं।
प्रश्न के दो पहलू हैं:
सामान्य तौर पर, नाम वाली कक्षाएं 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, मॉड्यूल सहायक अक्सर ऐसी चीजों के लिए पर्याप्त है।
मुख्य सहायकों का उपभोग करना कुछ ऐसा है जो आप अक्सर करेंगे।
__()
अनुवाद विधि: किसी विशिष्ट मॉड्यूल का अनुवाद प्राप्त करने के लिए, आपको उपयोग करना चाहिए 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()
विधि। यह अच्छा लगता है जब एक टेम्पलेट में उपयोग किया जाता है, लेकिन कोड एक बड़ी गड़बड़ है और यह एक सिंगलटन के रूप में समझ में नहीं आता है।
टी एल; डॉ:
Reader
और Writer
मॉडल, कि वास्तव में ऐसा राज्य (कम से कम एक फ़ाइल संसाधन) है। उदाहरण के लिए, CSV फ़ाइल से ऑर्डर स्थिति डेटा पढ़ने के लिए, मेरे पास sth होगा। एक OrderStatusCsvReader
मॉडल है कि एक OrderStatusUpdater
मॉडल द्वारा प्रयोग किया जाता है पसंद है । इस तरह मैंने चिंताओं को "फ़ाइल से डेटा पढ़ें" और "
मारियस सही है। मुझे लगता है कि मददगार बकवास हैं।
लेकिन Magento के सिद्धांत में आपको सहायकों में सब कुछ डाल देना चाहिए जो किसी वस्तु की स्थिति को नहीं बदलता है, उदाहरण के लिए स्वरूपित मूल्य प्राप्त करें।
लेकिन सब कुछ आप एक सहायक में डाल सकते हैं, आप एक मॉडल में भी डाल सकते हैं। और आप एक मॉडल के विभिन्न उदाहरण प्राप्त कर सकते हैं, जो परीक्षण के लिए सहायक है।
मैं Magento के लिए काफी नया हूँ, लेकिन मेरे लिए ऐसा लगता है कि एक हेल्पर Magento की सेवा के समकक्ष है : "संबंधित सॉफ़्टवेयर फ़ंक्शंस का एक सेट जिसे विभिन्न प्रयोजनों के लिए पुन: उपयोग किया जा सकता है"। एक मॉड्यूल सेवाओं के माध्यम से अपनी पेशकश की कार्यक्षमता का निर्यात करता है। उन कार्यों के लिए एक सहायक का उपयोग करें जिन्हें आप उपयोग करने के लिए अन्य मॉड्यूल को आमंत्रित करते हैं।
एक मॉडल को केवल ऐसी विधियाँ प्रदान करनी चाहिए जो किसी वस्तु की अवस्था को प्राप्त करने या स्थापित करने से सीधे संबंधित हों, या जो अन्यथा मॉडल की तात्कालिक वस्तु से जुड़ी हों।
डुप्लिकेट किए गए कोड (मॉडल, टेम्प्लेट, ...) में रोकथाम के लिए मदद मिलती है और कुछ समय के लिए वे आवश्यक हैं।
Mage::getStoreConfigFlag('my/module/enabled')
हर फ़ाइल की तरह कुछ जगह रख सकते हैं जहाँ आप यह जाँचना चाहते हैं, या आप Mage::helper('my_module')->isEnabled()
लाभ के साथ उपयोग करते हैं:
isEnabled()
विधि को फिर से लिख सकते हैं और यह कई फाइलों को फिर से लिखने के बजाय इसका उपयोग करने वाले सभी वर्गों को प्रभावित करेगा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';
foreach
लूप के भीतर संग्रह और सभी प्रकार के पागलपन को लोड कर रहा था । मैं एक सहायक को यह भयानक तर्क बाँटे और एक वस्तु कैश के रूप में उपयोग करने के लिए उपयोगी हो सकता है फिर से मिल गया, और भविष्य डेवलपर्स जो गलती से फोन हो सकता है से त्रुटियों के लिए कोई गुंजाइश नहीं छोड़getModel
के बजायgetSingleton
अगर मैं एक मॉडल में रखा था।