Magento2: प्लगइन और वरीयता के बीच बुनियादी अंतर क्या है?


47

मैंने magento2 ट्यूटोरियल में प्लगइन और वरीयता दोनों का उपयोग किया और दोनों ठीक काम कर रहे हैं लेकिन उनके बीच बुनियादी अंतर क्या है।

प्लगइन के लिए कोड:

1.1) di.xml में एक प्लगइन घोषणा जोड़ें:

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

1.2) एक प्लगइन वर्ग बनाएँ:

<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}

वरीयता के लिए कोड:

२.१) प्राथमिकता की घोषणा बनाएँ:

<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />

२.२) एक नया उत्पाद वर्ग बनाएँ:

<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}

जवाबों:


59

एक प्राथमिकता मैगेंटो से कक्षा पुनर्लेखन के बराबर है। यह कहने के बराबर है, "जब भी कोड मांगे ClassA, उन्हें MyClassBइसके बदले दें।" MyClassBयह अपेक्षा की जाती है कि ClassAआप जो भी व्यवहार जोड़ते हैं या संशोधित करते हैं, उसका पूर्ण कार्यान्वयन हो सकता है ।

Magento 1 में के रूप में, केवल एक वरीयता (फिर से लिखना) एक समय में एक वर्ग के लिए सक्रिय हो सकता है जब तक कि आप उन्हें मैन्युअल रूप से श्रृंखला नहीं देते (जैसे कि MyClassBविस्तार OtherClassB, और OtherClassBविस्तारित ClassA)।

एक प्लगइन आपको उस वर्ग से पहले, आस-पास या बाद के तरीकों को निष्पादित करने की अनुमति देता है जिस कक्षा से आप हुक कर रहे हैं। आपका प्लगइन वर्ग लक्ष्य वर्ग को प्रतिस्थापित नहीं करता है, और यह इसका उदाहरण नहीं है। तुम बस तरीकों before{method}, around{method}, after{method}{} विधि लक्ष्य वर्ग पर के संबंध में उचित समय पर निष्पादित हो जो।

चूंकि प्लगइन्स लक्ष्य वर्ग को प्रतिस्थापित नहीं करते हैं, इसलिए प्लगइन्स की कोई भी संख्या एक साथ कक्षा में सक्रिय हो सकती है। Magento बस उन्हें अपने XML में सॉर्टऑर्डर पैरामीटर के आधार पर एक के बाद एक निष्पादित करता है।

उस वजह से, प्लगइन्स वरीयताओं की तुलना में बहुत अधिक लचीले हैं। जब भी संभव हो, आपको प्लगइन्स का उपयोग करना चाहिए और जब तक बिल्कुल आवश्यक न हो तब तक पुनर्लेखन की प्राथमिकताओं से बचें।

आप इस बारे में अधिक पढ़ सकते हैं कि प्लगइन्स कैसे काम करते हैं और आधिकारिक प्रलेखन में उनका उपयोग कैसे किया जाता है ।


वरीयता वर्ग पुनर्लेखन के बराबर नहीं है। यह इंटरफेस के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान करने का तरीका है।
17

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

12

सरल शब्दों में

ओवरराइडिंग क्लास के लिए पसंद का उपयोग किया जाता है

पहले, बाद और आसपास के तरीकों को कार्यक्षमता जोड़ने के लिए प्लगइन का उपयोग किया जाता है।

आपके उदाहरण के लिए:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

जब भी कोड लिस्टप्रोडक्ट के लिए पूछता है, तो वरीयता ने कहा कि

अरे, इसके बजाय का उपयोग करेंVendor\MyModule\Block\Product\ListProduct Magento\Catalog\Block\Product\ListProduct

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

जब भी कोड getPrice () के लिए कहता है, प्लगइन ने कहा कि

अरे मेरी का उपयोग getPrice() विधि से पहले, के बाद और अपने चारों ओर getPrice() विधि


1

संक्षेप में :

इंटरफ़ेस के डिफ़ॉल्ट कार्यान्वयन को निर्दिष्ट करने के लिए वरीयता का उपयोग किया जाता है।

प्लगइन (इंटरसेप्टर) का उपयोग किसी अन्य वर्ग की सार्वजनिक पद्धति के व्यवहार को बढ़ाने के लिए किया जाता है।

विस्तार से :

वरीयता: यदि इंटरफ़ेस को लागू करने वाले एक से अधिक वर्ग हैं, तो सभी कार्यान्वित वर्गों में से एक डिफ़ॉल्ट को निर्दिष्ट करना महत्वपूर्ण है। यह निर्भरता इंजेक्शन फ़ाइल (di.xml) में वरीयता नोड के माध्यम से किया जाता है।

उदाहरण :

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

यह मानचित्रण में है app/etc/di.xml, इसलिए ऑब्जेक्ट प्रबंधक Magento\Core\Model\Urlकार्यान्वयन वर्ग को इंजेक्शन लगाता है जहां Magento\Core\Model\UrlInterfaceवैश्विक गुंजाइश के लिए अनुरोध है ।

प्लगइन (इंटरसेप्टर):

कहते हैं, एक वर्ग के Aपास एक तरीका है methodAजिसे विस्तारित कार्यक्षमता की आवश्यकता होती है। फिर, यह APluginमूल वर्ग को संशोधित किए बिना वर्ग बनाकर प्लगइन्स के माध्यम से प्राप्त किया जाता है A। कक्षा APluginमें वे विधियाँ हैं जो आवश्यक विधि से पहले, उसके बाद या उसके आसपास चलती हैं।

उदाहरण :

<config>
    <type name="Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock">
        <plugin name="showOutOfStockValueChanged" type="Magento\Catalog\Model\Plugin\ShowOutOfStockConfig"/>
    </type>
</config>

यह मैपिंग ऐप / etc / di.xml में है। वर्ग Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockविधि के कुछ / कुछ पहले / बाद में / वर्ग Magento\Catalog\Model\Plugin\ShowOutOfStockConfigविधियों के आसपास निष्पादित किए जाते हैं ।

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