Magento 2 में "इंटरसेप्ट-सक्षम / प्लगइन-सक्षम" कौन सी कक्षाएं हैं


17

दिनांक: 30 मई, 2015 (मैगेंटो 2 की बदलती प्रकृति को देखते हुए)।

Magento 2 ने एक इंटरसेप्टर पैटर्न के माध्यम से कार्यान्वित एक प्लगइन अवधारणा पेश की ।

डॉक्स से स्पष्ट नहीं है - मैगेंटो में कौन से वर्ग और ऑब्जेक्ट "इंटरसेप्ट-सक्षम" हैं? यही है, आप XML के साथ एक प्लगइन कॉन्फ़िगर करते हैं जो निम्न की तरह दिखता है

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

लेकिन यह स्पष्ट नहीं है कि कौन सी कक्षाएं मान्य हैं ObservedType। यह बड़े विकी लेख कुछ सुराग प्रदान करता है जब यह कहते हैं

कृपया ध्यान दें कि प्लग-इन सुविधा लागू नहीं होती है - निर्भरता इंजेक्शन के बिना बनाई गई कक्षाएं, यानी ऑपरेटर सीधे नए के साथ बनाई गई हैं, -Final विधियाँ, -Final कक्षाएं

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

मुख्य रूप से अपना सिर इधर-उधर करने से पहले मैजेंटो 2 इंटरसेप्टर के साथ क्या किया जा सकता है और नहीं कर सकता, इसका इस्तेमाल करना शुरू कर देता हूं।

जवाबों:


10

एक Magento के मॉड्यूल के हर वर्ग परस्पर क्रियाशील है।

जैसा कि वर्तमान विकी पर वर्णित है, यह अंतिम विधियों और कक्षाओं द्वारा सीमित है

मान्य नहीं है, लेकिन पुस्तकालयों की कक्षाएं (परिवाद निर्देशिका) हैं (/ चाहिए) अवरोधन प्राप्त करने की अनुमति नहीं है।

सीमा कैसे बनाई गई वस्तु अब सच नहीं है, मुझे लगता है कि कम से कम अगर ऑटोलैडर ठीक से कॉन्फ़िगर किया गया है। और उड़ने पर पैदा होने के रूप में कोई फर्क नहीं पड़ता, लेकिन जब जनरेटर निष्पादित हो गया। (इसलिए यह केवल एक मामला है, मैजेंटो ऑटोलैडर पहले वाला होना चाहिए)


2
हमें लिबास वर्गों के अवरोधन के लिए सीमा नहीं है। ऑब्जेक्ट को इंटरसेप्टेबल होने के लिए भी इसे ObjectManager (कंस्ट्रक्टर इंजेक्शन) के साथ बनाया जाना है।
एंटोन क्रिल

1
यह ध्यान दिया जाना चाहिए कि जादू के तरीकों (लेकिन phpdoc का उपयोग करके घोषित) को बाधित नहीं किया जा सकता है। मुझे लगता है। Varien_Object शैली अभी भी कुछ स्थानों पर मौजूद है।
नेवरमाइंड 20

11

हम अनुशंसित तरीकों से एनोटेट करने के लिए "@api" एनोटेशन पर काम कर रहे हैं जो रिलीज के दौरान अधिक स्थिर होंगे। आप upgradability के बारे में चिंता है, क्या करने के लिए अतिरिक्त में कर सकते हैं एक प्लगइन परिभाषित किया गया है, तो आप भी विचार करना चाहिए कि क्या करना चाहिए एक प्लगइन परिभाषित किया गया है। हम गैर-@ api विधियों के अवरोधन की अनुशंसा नहीं करते हैं, लेकिन कभी-कभी हम जानते हैं कि यह सबसे अच्छा विकल्प हो सकता है। (हम डेवलपर के विवेक पर छोड़ देते हैं।)

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


5

मुझे पता है कि इसका जवाब पहले से है, लेकिन यह 2 साल पहले से है। हो सकता है कि इस बीच कुछ चीजें बदल गईं।

यहाँ मुझे वही मिला है जो अब तक मिला है।
से आधिकारिक दस्तावेज और अवरोधन प्रक्रिया की खुदाई से।

मैं दूसरे तरीके का जवाब दूंगा। Magento में
क्या नहीं हो सकता है 2.
सरकारी डॉक्टर से

  • Magento \ फ्रेमवर्क \ अवरोधन से पहले त्वरित किया गया ऑब्जेक्ट बूटस्ट्रैप किया गया है (यह निश्चित नहीं है कि वह बिंदु कहाँ है)
  • अंतिम तरीके
  • अंतिम कक्षाओं से कोई भी विधि (क्योंकि उत्पन्न इंटरसेप्टर वर्ग को मूल वर्ग का विस्तार करना है)
  • कोई भी वर्ग जिसमें कम से कम एक अंतिम सार्वजनिक तरीका हो
  • गैर-सार्वजनिक विधियाँ (यह संरक्षित विधियों के लिए काम कर सकती हैं लेकिन यह "नैतिक" नहीं है क्योंकि यह गैर-सार्वजनिक तरीकों को वर्ग के बाहर तक ले जाएगी)
  • स्थैतिक तरीके
  • __construct
  • आभासी प्रकार

चारों ओर खुदाई से

  • कक्षाओं में तरीके जो ऑब्जेक्ट मैनेजर के माध्यम से त्वरित नहीं हैं। (उदाहरण \Magento\Framework\Phrase)
  • कक्षाएं लागू करना \Magento\Framework\ObjectManager\NoninterceptableInterface। (उदाहरण के लिए \Magento\Framework\App\Cache\Proxyऔर अन्य सभी ऑटोजेनरेटेड परदे के पीछे)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.