मैगेंटो इवेंट ऑब्जर्वर: सिंगलटन बनाम मॉडल


45

इसलिए Magento प्रेक्षक घोषित करने के 2 तरीके प्रदान करता है। <type>Magento 1.x में टैग को निर्दिष्ट करके और sharedMagento 2 में विशेषता को निर्दिष्ट करके सिंगलटन और मॉडल (नया उदाहरण) ।

Magento यह करने का 1 तरीका है।

<events>
    <event_name>
        <observers>
            <unique_observer_name>
                <type>model|object|singleton|null</type>
                <class>class/alias_here</class>
                <method>methdNameHere</method>
            </unique_observer_name>
        </observers>
    </event_name>
</events>

Magento 2 संस्करण:

<event name="event_name">
    <observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>

तो मैगेंटो 1 के मामले में, यदि <type>टैग मॉडल या ऑब्जेक्ट है, तो क्लास के साथ तत्काल किया जाएगा Mage::getModel()। यदि यह है singletonया यह याद आ रही है तो इसका उपयोग कर त्वरित है Mage::getSingleton()

Magento 2 के मामले में, अगर sharedहै falseतो वर्ग का उपयोग कर instantiated है $this->_observerFactory->create() (नया उदाहरण)।
अगर sharedयह सच है तो यह $this->_observerFactory->get()(सिंगलटन) का उपयोग कर त्वरित है।

दो संस्करणों के बीच घटना पर्यवेक्षक विचार बहुत समान है, लेकिन मैगेंटो 1 में अधिकांश पर्यवेक्षकों को सिंगलटन के रूप में उपयोग किया जाता है, क्योंकि typeटैग गायब है और मैगेंटो 2 में (मुझे लगता है) सभी पर्यवेक्षकों के पास है shared="false"

मैं चकरा गया हूं। मुझे सिंगलेट्स का उपयोग कब करना चाहिए और मुझे पर्यवेक्षकों के लिए नए उदाहरणों का उपयोग कब करना चाहिए?
Magento संस्करण (1 या 2) यहाँ महत्वपूर्ण नहीं है।
प्रत्येक दृष्टिकोण के लिए एक सरल उपयोग मामला (नया उदाहरण या सिंगलटन) होगा


साथ ही इससे जूझ रहा है। हालांकि यह बिल्कुल भी typeविशेषता का उपयोग करने के लिए आवश्यक नहीं है , ताकि मैं आमतौर पर अब इसे छोड़ दूं।
साइमन

@ साइमन मैं आमतौर पर इसे छोड़ देता हूं। कोई भी typeटैग वैसा नहीं है जैसा कि है <type>singleton</type>। तो क्या कारण है कि हम पर्यवेक्षकों को एकल बना रहे हैं?
मेरियस

यह वास्तव में एक अच्छा सवाल है। इसीलिए मैंने इसे उकेरा। बस यह इंगित करना चाहता था कि आप इसे पूरी तरह से छोड़ भी सकते हैं।
साइमन

जवाबों:


36

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

वास्तव में यह लगभग कभी नहीं हो रहा है, लेकिन Magento 1 और 2 डिफ़ॉल्ट रूप से साझा = सच्चे द्वारा उपयोग किया जाता है

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


5
एक अच्छी पर्याप्त व्याख्या की तरह तेजी। । और अब जब आपने इसका उल्लेख किया, तो उसने मुझे सिर में मार दिया ... सिंग्लेटों के लिए एक वास्तविक उपयोग का मामला: जब आप निरीक्षण करना चाहते हैं _save_beforeऔर _save_afterबाद में किसी चीज पर निर्भर होने के बाद बचत पर कार्रवाई करना चाहते हैं _save_before। ओह! मैं इसे कैसे याद कर सकता था?
मेरियस

"जो है, क्यों magento2 डिफ़ॉल्ट रूप से साझा = गलत द्वारा उपयोग करता है" यह गलत है। Magento 2 डिफ़ॉल्ट रूप से उपयोग करता shared=trueहै
Mage2.PRO


thx, उत्तर को अपडेट किया
फ्लाइंगमैन

1

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

Upfrontly magento 2.0 साझा वस्तुओं का उपयोग करने के लिए उपयोग करता है .. Magento 2.0 में बहुत अच्छी तरह से लिखे गए विध्वंसक हैं जो काम पूरा होते ही स्मृति को साफ करते रहते हैं!

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