Magento 2 में अमूर्त वर्ग को ओवरराइड करें


13

Magento 1 में मैं सार वर्ग को स्थानीय या सामुदायिक निर्देशिका में कॉपी कर सकता था और Magento इसका उपयोग करता था, जब ऑटोलॉड इस वर्ग को लोड करता है।

क्या इसके बजाय मैगेंटो को मेरी कक्षा में लोड करने के लिए कुछ समाधान है vendor/magento/framework/Model/AbstractModel.php?

di.xmlअमूर्त वर्गों के लिए प्राथमिकताएं काम नहीं करती हैं। केवल प्लगइन्स?

जवाबों:


9

केवल प्लगइन्स?

हाँ। आप अमूर्त कक्षाओं के लिए प्लगइन्स लिख सकते हैं और यदि संभव हो तो प्लगइन्स को हमेशा वरीयताओं पर प्राथमिकता दी जानी चाहिए।

यदि आप किसी कार्यान्वयन को प्रतिस्थापित करना चाहते हैं तो प्राथमिकताएँ उपयोगी हैं । AbstractModelअगर यह तार्किक रूप से भी संभव है तो सभी मॉडलों के कार्यान्वयन को बदलने के लिए मैं उपयोग के मामले के बारे में नहीं सोच सकता। तो आप जो चाहते हैं, वह कार्यक्षमता को जोड़ना या बदलना है और यही प्लगइन्स के लिए है।


1
नमस्ते, मैं इस मामले में अमूर्त वर्ग से एक संरक्षित फ़ंक्शन को कैसे ओवरराइड कर सकता हूं? क्या आप मदद कर सकते हैं
मानशिव बिरला

2
यह संभव नहीं है। सबसे अच्छा तरीका यह है कि संरक्षित तरीकों का उपयोग करने वाले सार्वजनिक तरीकों से प्लगइन्स को जोड़ने का एक तरीका खोजने की कोशिश करें, और इस तरह से व्यवहार को बदलें, भले ही इसमें अधिक कोड और कुछ दोहराव शामिल हों।
फेबियन शेंगलर

1
"मैं सभी मॉडलों के लिए कार्यान्वयन को बदलने के लिए एक उपयोग के मामले के बारे में नहीं सोच सकता हूं जो AbstractModel का विस्तार करता है" मेरे पास ऐसा उपयोग मामला है: मेरे पास भुगतान मॉड्यूल है, जो 4 नियंत्रकों के लिए सार आधार वर्ग का उपयोग करता है, प्रत्येक आधार से एक विधि का उपयोग करके सत्यापित करता है भुगतान गेटवे से प्रतिक्रिया। अब, प्रतिक्रिया बदल गई है और मुझे सभी को बदलना होगा 3.
तेरो लहतिन

6

पूर्ण समाधान: उन्हें मैग्नेटो ऑटोलॉड से पहले प्रतिस्थापित कक्षाएं शामिल करें। तो कदम दर कदम:

  1. फ़ाइल app/etc/NonComposerComponentRegistration.phpजोड़ पंक्ति में

    $pathList[] = dirname(__DIR__) . '/etc/ClassReplacer.php';
  2. में app/etcजगह फ़ाइल ClassReplacer.phpसामग्री के साथ

    class ClassReplacer
    {
        public function includeReplacedFiles($src)
        {
            try {
                $replacedFiles = $this->listDir($src, false, true);
                foreach ($replacedFiles as $replacedFile) {
                    include_once $src . $replacedFile;
                }
            } catch (Exception $e) {
                return;
            }
        }
    
        protected function listDir($dir, $prependDir = false, $recursive = false, $entityRegexp = null, $currPath = '')
        {
            if (!is_dir($dir)) {
                return array();
            }
            $currPath = $prependDir ? $dir : $currPath;
            $currPath = $currPath !== '' ? rtrim($currPath, '/') . '/' : '';
            $files = array();
            foreach (scandir($dir) as $file) {
                if (in_array($file, array('.', '..'))) {
                    continue;
                }
                $entity = $currPath . $file;
                if ($recursive && is_dir("$dir/$file")) {
                    $files = array_merge($files, $this->listDir("$dir/$file", false, true, $entityRegexp, $entity . '/'));
                    continue;
                }
                if ($entityRegexp && !preg_match($entityRegexp, $entity)) continue;
                $files[] = $entity;
            }
            return $files;
        }
    }
    $replace = new ClassReplacer();
    $replace->includeReplacedFiles(dirname(__DIR__) . '/code/Magento/');
    
  3. app/code/Magentoकुछ वर्ग को रखें , जिन्हें प्रतिस्थापित किया जाएगा, जैसेapp/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php



1
डर्टी हैक, लेकिन कुछ समय ऐसा करने में सक्षम होना मददगार हो सकता है। कोर कक्षाओं में M1 को मैनुअल परिवर्तन की आवश्यकता होती है (इसलिए एप्लिकेशन / कोड / स्थानीय पर कॉपी करें) यदि आप पीडीएफ को अलग-अलग देखने के लिए चाहते हैं, तो मुझे यकीन है कि कुछ मामला होगा जहां इसकी आवश्यकता होगी।
ज़ेफिरिन

5

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

मुझे _processDownloadअंदर विधि को ओवरराइड करना पड़ा \Magento\Downloadable\Controller\Download, कुछ 'इफ-एस' के अंदर जोड़ दिया। (अगर किसी को पता है कि मैं प्लगइन्स का उपयोग करके इस तरह की विधि को कैसे जोड़ सकता हूं तो मैं आभारी रहूंगा)। कक्षा अमूर्त है इसलिए वरीयता काम नहीं की। प्लगइन्स भी, क्योंकि विधि संरक्षित है। मुझे जो काम करना था Download, वह वरीयता का उपयोग करते हुए सभी वर्ग से आगे निकल गया । ये वर्ग:

Magento\Downloadable\Controller\Download\Link Magento\Downloadable\Controller\Download\LinkSample Magento\Downloadable\Controller\Download\Sample

और उनके अंदर माता-पिता वर्ग से विधि को फिर से लिखना (जिसे मैं ओवरराइड करने वाला था)। इसलिए वास्तव में ओवरराइड विधियों के कोड को तीन स्थानों पर कॉपी किया गया था और बिल्कुल वैसा ही था।

यह आदर्श नहीं है, लेकिन काम करता है।


4

आप किसी भी सार वर्ग की मौजूदा कार्यक्षमता को बढ़ाने के लिए Magento Plugin का उपयोग करने का प्रयास कर सकते हैं, हालांकि फ़ंक्शन का दायरा सार्वजनिक होना चाहिए। हाल ही में मैंने उसी मुद्दे पर काम किया, जहां मुझे हाल ही में देखी गई उत्पाद सूची से निर्दिष्ट कस्टम विशेषता वाले उत्पादों को बाहर करने की आवश्यकता है ।

मैं फ़ंक्शन के लिए प्लगइन का उपयोग करता था जिसका नाम getItemsCollection है जिसका नाम Magento \ Report \ Block \ Product \ Abstract \ Product में निम्नलिखित सिंटैक्स का उपयोग करके दिया गया है:

फ़ाइल: app \ code \ Package \ Module \ etc \ frontend \ di.xml

<type name="Magento\Reports\Block\Product\AbstractProduct">
    <plugin name="Package_Module::aroundGetItemsCollection" type="Package\Module\Block\Viewed" sortOrder="20"/>
</type>

फ़ाइल: एप्लिकेशन \ कोड \ पैकेज \ मॉड्यूल \ ब्लॉक \ Viewed.php

public function afterGetItemsCollection(
    $subject, $result
) {
    $result = $result->addAttributeToFilter('skip_hire_product', [['neq' => 1], ['null' => true]], 'left');
    return $result;
}

आप चारों ओर प्लगइन्स से पहले भी उपयोग कर सकते हैं। आशा है कि यह काम आपके लिए होगा।


1
मुझे अपनी आवश्यकता में से एक में उपरोक्त कोड के साथ सफलता मिली, वास्तव में मैं ईमेल मॉड्यूल अमूर्त वर्ग विधि की कुछ कार्यक्षमता को बदलना चाहता था और प्लगिन ने मुझे इसे प्राप्त करने में मदद की, धन्यवाद
भार्गव शास्त्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.