Magento 2: मॉड्यूल डेवलपर्स को अपनी कॉन्फ़िगरेशन फ़ाइलों को कैसे पढ़ना चाहिए


20

परिदृश्य: मैं एक Magento के 2 मॉड्यूल डेवलपर हूं। मैं एक कॉन्फ़िगरेशन फ़ाइल बनाना चाहता हूं app/etc। मैं चाहता हूं कि यह फाइल क्षेत्र द्वारा "स्कूप" हो

app/etc/my_file.xml
app/etc/frontend/my_file.xml
app/etc/adminhtml/my_file.xml

Magento 1 में मैं बस एक config.xmlऔर अपने रास्ते पर हो जाएगा। एक्सएमएल फाइल में ही एरिया स्कूपिंग हुआ। हालाँकि, Magento 2 इसे बहुत अलग तरीके से पेश करता है

मैगेंटो 2 में, मुझे इन स्कोप्ड कॉन्फ़िगरेशन फ़ाइलों को पढ़ने के लिए कौन सी क्लास की फाइल बनानी चाहिए? यह Magento 2 स्रोत से स्पष्ट नहीं है कि ऐसा करने का "सही" तरीका क्या है। मुख्य कोड कई दृष्टिकोण लेते हैं, और उनमें से कोई भी एक @apiविधि के साथ चिह्नित नहीं है । इससे यह जानना मुश्किल हो जाता है कि इस सामान्य मॉड्यूल डेवलपर कार्य को कैसे आगे बढ़ाया जाए। द्वितीयक साइड-इफ़ेक्ट के रूप में, यह जानना भी मुश्किल हो जाता है कि कोर कॉन्फ़िगरेशन फ़ाइलों से Magento मॉड्यूल डेवलपर को कैसे पढ़ना चाहिए ।

एक तरफ, ऐसा लगता है कि "सही" करने के लिए फ़ाइल सिस्टम रीडर ऑब्जेक्ट बनाना है। उदाहरण के लिए, Magento import.xmlफ़ाइल को निम्न के साथ लोड करता है

#File: vendor/magento/module-import-export/Model/Import/Config/Reader.php
namespace Magento\ImportExport\Model\Import\Config;

class Reader extends \Magento\Framework\Config\Reader\Filesystem
{

    public function __construct(
        //...
        $fileName = 'import.xml',
        //...
    ) {
        parent::__construct(
            $fileResolver,
            $converter,
            $schemaLocator,
            $validationState,
            $fileName,
            $idAttributes,
            $domDocumentClass,
            $defaultScope
        );
    }
    //...
}        

बेस Magento\Framework\Config\Reader\Filesystemक्लास ऐसा लगता है कि इसमें क्षेत्र के दायरे को हल करने के लिए कोड है।

हालाँकि कुछ Magento की कॉन्फ़िगरेशन फ़ाइल इस पैटर्न से बच निकली हैं। जबकि इन फ़ाइलों के लिए पाठक हैं ( event.xmlइस उदाहरण में)

vendor/magento/framework/Event/Config/Reader.php

इन पाठकों का उपयोग करने वाली "स्कोप्ड डेटा" कक्षाएं भी हैं।

#File: vendor/magento/framework/Event/Config/Data.php
class Data extends \Magento\Framework\Config\Data\Scoped
{
    public function __construct(
        \Magento\Framework\Event\Config\Reader $reader,
        //...
    ) {
        parent::__construct($reader, $configScope, $cache, $cacheId);
    }
}

इससे यह प्रतीत होता है कि स्कोप रीडर क्लासेस एक मॉड्यूल डेवलपर को बनाना चाहिए। लेकिन सभी कॉन्फ़िगरेशन फ़ाइलों में ये स्कैन किए गए पाठक नहीं हैं।

वहाँ Magento 2 मॉड्यूल डेवलपर्स का पालन करने के लिए एक स्पष्ट रास्ता है? या यह सिर्फ कुछ है Magento 2 मॉड्यूल डेवलपर्स को अपने तरीके से संपर्क करना चाहिए, और परिणामस्वरूप अराजकता / गैर-मानक-कॉन्फ़िगरेशन-लोडिंग केवल व्यवसाय करने की लागत है?

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


: मैं इस कर सकते हैं मदद लगता है magento.stackexchange.com/q/51915/146
मेरियस

क्या आपने @ PR को @vinai github.com/magento/magento2/pull/1410 से देखा है ? मुझे लगता है कि यदि आपके पास विशेष आवश्यकताएं नहीं हैं, तो आप अपनी स्वयं की कॉन्फिग फ़ाइल को केवल आभासी प्रकारों के साथ रोल कर सकते हैं।
पर फोमन

जवाबों:


4

नए कॉन्फ़िगरेशन प्रकार बनाने के लिए, मॉड्यूल डेवलपर को कॉन्फ़िगरेशन प्रकार वर्ग बनाना चाहिए जो कॉन्फ़िगरेशन के ग्राहकों द्वारा उपयोग किया जाएगा।

इन प्रकार की कक्षाओं को यथासंभव सरल बनाने के लिए, कॉन्फ़िगरेशन फ़ाइलों को पढ़ने और डेटा को कैशिंग करने के सभी व्यवहार को \Magento\Framework\Config\DataInterfaceदो पुन: प्रयोज्य कार्यान्वयन के साथ स्थानांतरित किया गया था :

  • \Magento\Framework\Config\Data - कॉन्फ़िगरेशन प्रकारों के लिए जो केवल एक दायरे में लोड होने का मतलब बनाते हैं (eav_attributes.xml केवल वैश्विक में)
  • \Magento\Framework\Config\Data\Scoped - विभिन्न प्रकारों (घटनाओं.xml - वैश्विक और प्रति-क्षेत्र) पर लोड किए जा सकने वाले कॉन्फ़िगरेशन प्रकारों के लिए

प्रत्येक कॉन्फ़िगरेशन प्रकार को पूर्व-कॉन्फ़िगर Config\DataInterfaceऑब्जेक्ट माना जाता है । कॉन्फ़िगरेशन वर्चुअल प्रकार के साथ या वंशानुक्रम के साथ किया जा सकता है।

यद्यपि मॉड्यूल डेवलपर तकनीकी रूप से Config\DataInterfaceकार्यान्वयन से अपने कॉन्फ़िगरेशन प्रकार को विरासत में ले सकता है , यह कोर कक्षाओं से नहीं बढ़ाने की सिफारिश की गई है। रचना का उपयोग करने के लिए हमेशा बेहतर होता है।

अभी \Magento\Framework\Config\Dataऔर Data\Scopedकेवल कैशिंग और प्रतिनिधि कॉन्फ़िगरेशन रीडिंग करते हैं \Magento\Framework\Config\ReaderInterfaceReaderInterfaceअनुरोधित स्कोप के लिए PHP सरणी के प्रारूप में मान्य कॉन्फ़िगरेशन प्रदान करने वाला है (यदि कॉन्फ़िगरेशन स्कोप किया गया है)। कई कार्यान्वयन ReaderInterfaceसंभव हैं (उदाहरण के लिए DB से कॉन्फ़िगरेशन पढ़ें) लेकिन Magento केवल एक सामान्य पाठक को शिप करता है \Magento\Framework\Config\Reader\Filesystem:।

\Magento\Framework\Config\Reader\Filesystem मॉड्यूलर फाइल सिस्टम से फ़ाइलों को पढ़ने के लिए आवश्यक सभी ऑपरेशन करता है: फ़ाइलें पढ़ें, मर्ज करें और मान्य करें।

प्रत्येक Config\DataInterfaceको अलग से कॉन्फ़िगर किया गया उदाहरण माना जाता है Config\ReaderInterface। सिस्टम में किसी भी उदाहरण के रूप में, विशिष्ट रीडर को वर्चुअल टाइप या इनहेरिटेंस के साथ कॉन्फ़िगर किया जा सकता है। Magento के प्रलेखन सभी Filesystemनिर्भरता का वर्णन करता है।

इस श्रृंखला में प्रत्येक तत्व वैकल्पिक है (केवल विन्यास प्रकार वर्ग को छोड़कर) और इसे अधिक विशिष्ट कार्यान्वयन के साथ प्रतिस्थापित किया जा सकता है।


1

ऐसा लगता है कि आधिकारिक दस्तावेज में आपके प्रश्न के उत्तर हैं।


1
जवाब देने के लिए धन्यवाद, लेकिन मुझे यकीन नहीं है कि प्रलेखन मेरे सवाल का जवाब देता है। यह कई इंटरफेस (जो कि उपयोगी है, उसके लिए +1) सूचीबद्ध करता है, जो उपलब्ध हैं, लेकिन इस तथ्य को समेटता नहीं है कि उन इंटरफेस ( Magento\Framework\Config\Dataऔर Magento\Framework\App\Config) के ठोस कार्यान्वयन में से कोई भी @api के साथ चिह्नित नहीं है। यदि केवल उस दस्तावेज के साथ छोड़ दिया जाता है तो मैं इस धारणा के तहत रहूंगा कि, एक मॉड्यूल डेवलपर के रूप में, कॉन्फ़िगरेशन फ़ाइल बनाने और पढ़ने के लिए कोई मानक प्रणाली नहीं है , और मैं जो कुछ भी कर सकता हूं, वह कर सकता हूं। यह सही नहीं लगता।
एलन स्टॉर्म

क्या आप ऐसे मामलों का वर्णन कर सकते हैं जब आपको किसी अन्य मॉड्यूल के लिए कॉन्फ़िगरेशन पढ़ने की आवश्यकता होती है? मेरे लिए विन्यास पाठक मॉड्यूल का निजी एप है।
21

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

इसके अलावा - (थोड़ा अलग / स्पर्शरेखा) Magento के बैकएंड में सिस्टम कॉन्फ़िगरेशन अनुभाग - एक मौजूदा अनुभाग के कॉन्फ़िगरेशन के आधार पर एक विशेषता का निर्माण।
एलन स्टॉर्म

2
कोई भी एपीआई जो @api के साथ एनोटेट नहीं किया गया है, वह इस मायने में निजी है कि यदि आप इसका उपयोग करते हैं तो आप पिछड़ी अनुकूलता के लिए जिम्मेदार हैं। \ Magento \ Framework \ Config \ ReaderInterface में \ @api एनोटेशन है।
21

0

इस लेखन के समय, ऐसा प्रतीत नहीं होता है कि एक मानक मैजेंटो में मर्ज किए गए कॉन्फ़िगरेशन ट्री को पढ़ने के लिए है। प्रत्येक मॉड्यूल अपने स्वयं के कॉन्फ़िगरेशन पढ़ने की कक्षाओं को लागू करता है, जिसका अर्थ है प्रत्येक डेवलपर के लिए यह तय करना कि वे इस विलय को कैसे चाहते हैं। होना। जबकि Magento ऐसा करने के लिए कुछ स्टॉक कक्षाएं प्रदान करता है, यहां तक ​​कि कोर कोड के बीच इन वर्गों का उपयोग असंगत है।

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