कस्टम मॉड्यूल में घटनाओं को कब भेजना है?


14

यह Magento 1 और Magento 2 दोनों के संबंध में एक प्रश्न है।

मैं समझता हूं कि, एक अच्छे अभ्यास के रूप में, 3 पार्टी मॉड्यूल डेवलपर्स को अपने कस्टम मॉड्यूल में घटनाओं को भेजने के लिए प्रोत्साहित किया जाता है ताकि अन्य मॉड्यूल के साथ काम करना आसान हो सके।

मैं जानना चाहता हूँ:

  • एक कस्टम मॉड्यूल में एक डेवलपर को इवेंट कहां भेजना चाहिए?
  • क्या घटनाओं को भेजने के लिए कोई अनुशंसित स्थान है? जैसे नियंत्रक, मॉडल, ब्लॉक, हेल्पर्स, ऑब्जर्वर?
  • प्रेषण घटनाओं के प्रदर्शन को कैसे प्रभावित करता है?

हाँ! अच्छा प्रश्न। किसी को भी इस सवाल का जवाब कृपया। यह थर्ड पार्टी एक्सटेंशन डेवलपर्स के साथ-साथ कस्टम प्रोजेक्ट्स के लिए भी बहुत मददगार होगा।
मापलडिया

जवाबों:


10

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

चूंकि यह असंतोषजनक है, आप अपने मॉड्यूल को एक घटना भेजना चाहते हैं जब आपका मॉड्यूल कुछ कार्रवाई करता है जो आपके उपयोगकर्ता आइटम जोड़ना चाहते हैं, आइटम को हटा सकते हैं, बदल सकते हैं, या मूल कार्रवाई से अलग कार्रवाई कर सकते हैं। उदाहरण के लिए - Magento में एक visitor_initघटना है जो ऑटो उत्पन्न घटनाओं के अपने मानक सूट का हिस्सा नहीं है। यह घटना प्रोग्रामर्स को Magento के लॉग्स डेटा से पहले विज़िटर objet को संशोधित करने की अनुमति देता है। ये कोई तरीका नहीं था कि मूल मॉड्यूल डेवलपर्स निर्धारक रूप से जानेंयह वह जगह थी जहां एक घटना को जोड़ने की आवश्यकता थी - यह संभवत: सिस्टम उपयोगकर्ताओं के साथ फीचर अनुरोध और / या साक्षात्कार से आया था। जानें कि आपके उपयोगकर्ता क्या चाहते हैं, और अगर यह संभव नहीं है / व्यावहारिक नहीं है तो उन्हें UI / UX बनाने के लिए उन्हें व्यवस्थापक के माध्यम से करने के लिए, एक इवेंट हुक जोड़ें ताकि एक और प्रोग्रामर उनके लिए यह कर सके।

कम यौन रूप से, घटनाओं को जोड़ना डेवलपर्स (या आपके उपयोगकर्ता या यहां तक ​​कि आपकी टीम) को सक्षम करने के लिए एक सस्ता तरीका हो सकता है, जिसमें कुछ कार्यक्षमता को कोड के रूप में जोड़ा जा सकता है जिसे हर कोई छूने से डरता है। अपने dispatchEventकॉल को कोड के बीच में रखें, इसमें हुक लगाएं और आप मूल कार्यक्षेत्र में कोड को परेशान किए बिना अपनी कार्यक्षमता को जोड़ सकते हैं। [संपादक: इसके अलावा आपको कुछ बिंदु पर उस भयानक कोड को फिर से भरना चाहिए]

प्रदर्शन वार, प्रेषण के लिए एक घटना को जोड़ना जहां आप इसे जोड़ते हैं उस पर निर्भर करेगा। जब आप dispatchईवेंट कॉल करते हैं , तो Magento को कुछ अतिरिक्त PHP कॉल करने की आवश्यकता होती है, किसी भी कॉन्फ़िगर किए गए पर्यवेक्षकों के लिए कॉन्फ़िगरेशन की क्वेरी करें, और फिर पर्यवेक्षकों को कॉल करें। एक बार किया, यह एक मानक Magento प्रेषण के दायरे में एक सस्ता जोड़ है। हालाँकि, बार-बार किया जाता है, (कहते हैं, हर ब्लॉक रेंडर से पहले) यह जोड़ सकता है। यहाँ अंगूठे का कोई अच्छा नियम नहीं है - हमेशा की तरह सही उत्तर प्रोफ़ाइल है।

अंत में, w / r / t Magento 2, अभी भी कहना जल्दबाजी होगी। उपरोक्त सभी अभी भी लागू होते हैं - हालांकि प्लगइन सिस्टम कुछ झुर्रियों को जोड़ता है। प्लगइन्स, एक दृष्टिकोण से, मैगेंटो में किसी भी सार्वजनिक विधि कॉल के लिए व्यवहार जैसी घटना बनाने का एक तरीका है । सिद्धांत रूप में, यदि आप अपनी कक्षाओं को सही ढंग से डिजाइन कर रहे हैं, तो आपको कभी भी एक घटना की आवश्यकता नहीं होनी चाहिए। हालांकि, व्यवहार में, किसी घटना को संरक्षित या निजी विधि कोड के एक बिट में छोड़ने से मैगेंटो डेवलपर्स के लिए एक लुभावना समाधान हो जाएगा जब विकल्प एक लंबी रिफैक्टिंग प्रक्रिया है। इसके अलावा, विशेष रूप से नामित ईवेंट बनाने से अक्सर आपके मॉड्यूल का उपयोग करने वाले डेवलपर्स के लिए एक मित्रतापूर्ण अनुभव हो सकता है।

उम्मीद है की वो मदद करदे!


9

Magento 1 के लिए, घटनाओं को फेंकने के लिए अच्छा समय सभी CRUD ऑपरेशन से पहले और बाद में और रेंडरिंग से पहले है। इनमें से कई पहले से ही कोर में अमूर्त वर्गों द्वारा प्रदान किए जाते हैं, इसलिए व्यवहार में नहीं कि कई तृतीय पक्ष घटनाओं की आवश्यकता होती है।

Magento 2 के साथ स्थिति अलग है। क्योंकि पब्लिक मेथड कॉल को प्लगइन्स के साथ इंटरसेप्ट किया जा सकता है, कस्टम इवेंट्स की अब आवश्यकता नहीं है।
कक्षाओं को डिजाइन करते समय, बस हर विधि को सार्वजनिक करने के बजाय ताकि इसे इंटरसेप्ट किया जा सके, एक बड़ी कक्षा को छोटे वर्गों में विघटित करना बेहतर होता है।
छोटी कक्षाओं में से प्रत्येक में एक या दो अच्छी तरह से नामित और इंटरसेप्टेबल सार्वजनिक तरीके हो सकते हैं।


0

जैसे विनय ने कहा, CRUD ऑपरेशन से पहले / बाद में। ईवेंट को प्रेषण करने के लिए एक अन्य महत्वपूर्ण स्थान है, जो कि adminhtml फॉर्म ब्लॉक (यदि लागू हो) है। इस तरह आप नए इनपुट फ़ील्ड जोड़ सकते हैं यदि आपने व्यवस्थापक प्रपत्र ब्लॉक को फिर से लिखने के बिना कस्टम विशेषताएँ / फ़ील्ड जोड़ दिए हैं। (यह Magento 1 के लिए है)। उदाहरण देखें


0

मैगेंटो 1 के अंदर, आप ऑटो-फेयर होने वाली घटनाओं के माध्यम से घटनाओं का लाभ उठा सकते हैं। आपको बस अपने मॉडल पर एक $_eventPrefixऔर $_eventObjectगुण सेट करने की आवश्यकता है । साथ ही, आपके पास नियंत्रक पर स्वचालित रूप से 'controller_action_predispatch_ ' . $this->getFullActionName()और 'controller_action_postdispatch_' . $this->getFullActionName()ईवेंट के माध्यम से कस्टम फ़ाइंड किए गए ईवेंट नियंत्रक हैं। उन सबसे आप वहां पहुंच सकते हैं।

Magento 2 के लिए, अपने तरीकों को अपनी कक्षाओं के अंदर सार्वजनिक रखें। इससे प्लगइन्स आपके तरीकों को बाधित कर सकते हैं। यदि आप इसका अनुसरण करते हैं, तो आपको कोई कस्टम ईवेंट नहीं बनाना होगा।

आशा है कि ये आपकी मदद करेगा!

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