टाइप और virtualType में क्या अंतर है


41

उस में di.xmlMagento2 के साथ आता है एक नोड typeऔर एक नोड है virtualType। मेरा सवाल यह है कि यह क्या है virtualTypeऔर किस मामले में इसके बजाय इसका उपयोग किया जाना चाहिए type?

कुछ स्थानों पर यह एक प्रतीकात्मक लिंक या पुनर्लेखन जैसा दिखता है:

<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">

जहां एक पूर्ण पथ दूसरे में परिवर्तित हो जाता है, लेकिन अन्य स्थानों पर यह एक छोटे उपनाम को परिभाषित करने के तरीके के रूप में उपयोग किया जाता है।

<virtualType name="lessFileSourceBase" type="Magento\Framework\View\File\Collector\Base">

3
मुझे पता नहीं (अभी तक) वे भी क्या मतलब है, लेकिन आप यहां से खुदाई शुरू कर सकते हैं: Magento\Framework\ObjectManager\Config\Mapper\Dom::convertswitchकहीं पर एक बयान है।
मेरियस

धन्यवाद @ मारीश, मैं यह भी सोच रहा हूं कि क्या lessFileSourceBaseएक्सएमएल तक सीमित है या यदि वह बाहर भी इस्तेमाल किया जा सकता है। मुझे लगता है मैं बेहतर खुदाई हो रही है।
डेविड मैनर्स

जवाबों:


83

वर्चुअल प्रकार अन्य वर्गों को प्रभावित किए बिना विभिन्न निर्भरता को मौजूदा कक्षाओं में इंजेक्ट करने का एक तरीका है।

उदाहरण के लिए, Magento\Framework\Session\Storageवर्ग $namespaceअपने कंस्ट्रक्टर में एक तर्क लेता है , जो मान 'डिफ़ॉल्ट' के लिए चूकता है, और आप typeनेमस्पेस को 'कोर' में बदलने के लिए परिभाषा का उपयोग कर सकते हैं ।

<type name="Magento\Framework\Session\Storage">
    <arguments>
        <argument name="namespace" xsi:type="string">core</argument>
    </arguments>
</type>

उपरोक्त विन्यास ऐसा बना देगा कि सभी उदाहरणों Magento\Framework\Session\Storageमें 'कोर' का नाम स्थान होगा। वर्चुअल प्रकार का उपयोग करने से उप-वर्ग के समतुल्य बनने की अनुमति मिलती है, जहाँ केवल उप-वर्ग में परिवर्तित तर्क मान होते हैं।

कोडबेस में हम निम्नलिखित दो विन्यास देखते हैं:

<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">
    <arguments>
        <argument name="namespace" xsi:type="string">core</argument>
    </arguments>
</virtualType>

<type name="Magento\Framework\Session\Generic">
    <arguments>
        <argument name="storage" xsi:type="object">Magento\Core\Model\Session\Storage</argument>
    </arguments>
</type>

पहला स्निपेट एक आभासी प्रकार बनाता है Magento\Core\Model\Session\Storageजिसके लिए नाम स्थान को बदल देता है, और दूसरा वर्चुअल प्रकार को इंजेक्ट करता है Magento\Framework\Session\Generic। यह Magento\Framework\Session\Genericअन्य वर्गों को प्रभावित किए बिना अनुकूलित करने की अनुमति देता है जो इस पर निर्भरता भी घोषित करता हैMagento\Framework\Session\Storage


बहुत बहुत धन्यवाद @ क्रिस अंत में कुछ तार्किक औचित्य मैंने पाया
सुमन- PHP4U

यह सरल और सबसे अच्छा प्रदर्शन था।
उमर

यह उत्तर बेहतर है तब
मैगेंटो

<type>एक आभासी वर्ग का उपयोग कर रहा है जो वास्तव में मौजूद नहीं है। इस तरह से तर्क में संशोधन virtualTypeतभी प्रभावी होगा जब वर्चुअलटाइप का उपयोग करने वाले वर्ग को आरंभीकृत किया जाता Magento\Framework\Session\Genericहै जो उदाहरण में है
आरिफ अहमद

21

आभासी प्रकार समझने का दूसरा तरीका -

मान लीजिए कि आपके पास एक वर्ग है \Class1, जिसमें निम्नलिखित निर्माता हैं -

public function __construct(\Class2 $argOfClass1){...}

और \Class2निम्नलिखित निर्माता हैं -

public function __construct(\Class3 $argOfClass2){...}

अब, आप का प्रकार परिवर्तित करना चाहते $argOfClass2से \Class3करने के लिए \Class4है, लेकिन केवल जब \Class2के रूप में प्रयोग किया जाता है $argOfClass1

ऐसा करने का "पुराना" तरीका निम्नलिखित में जोड़ना होगा di.xml-

<type name="Class1">
    <arguments>
         <argument name="argOfClass1" xsi:type="object">Class5</argument>
    </arguments>
</type>

ये कहाँ \Class5है:

class \Class5 extends \Class2{
    public function __construct(\Class4 $argOfClass2){...}
}

इस तरीके का उपयोग करने के बजाय, आप निम्नलिखित को जोड़कर, इसे पूरा करने के लिए आभासी प्रकारों का उपयोग कर सकते हैं di.xml:

<virtualType name="Class5" type="Class2">
    <arguments>
        <argument name="argOfClass2" xsi:type="string">Class4</argument>
    </arguments>
</virtualType>

<type name="Class1">
    <arguments>
         <argument name="argOfClass1" xsi:type="object">Class5</argument>
    </arguments>
</type>

जैसा कि आप देख सकते हैं, वर्चुअल प्रकार का उपयोग करके आपने निर्माण के कार्य को बचाया है Class5

आगे के संदर्भ के लिए मैं Magento2 में आभासी प्रकारों के बारे में एलन स्टॉर्म के लेख को पढ़ने का सुझाव देता हूं - http://alanstorm.com/magento_2_object_manager_virtual_types/


1
अच्छा
निष्कासन

समझने में आसान। इस तरह के मूल उदाहरण को साझा करने के लिए धन्यवाद।
कल्याण चक्रवर्ती V

10

उसी di.xmlफ़ाइल में मैंने पाया कि उस के lessFileSourceBaseलिए एक तर्क के lessFileSourceBaseFilteredरूप में पारित किया जाता है, lessFileSourceBaseSortedउस के लिए एक तर्क के रूप में पारित किया जाता है, प्रकार के लिए एक तर्क के रूप में पारित किया जाता है Magento\Framework\Less\File\Collector\Aggregated

मुझे कोर मॉड्यूल को छोड़कर किसी अन्य फ़ाइल में lessFileSourceBase(या lessFileSource) की कोई अन्य घटना नहीं मिली di.xml। केवल कुछ कैश फ़ाइलों में लेकिन वे महत्वपूर्ण नहीं हैं।

मुझे लगता है कि यदि आप एक PHP वर्ग में वर्चुअल प्रकार का उपयोग नहीं करने जा रहे हैं, लेकिन केवल dixml फ़ाइलों में तो आपको इसे क्लास नाम की तरह बनाने की आवश्यकता नहीं है और आप एक उपनाम का उपयोग कर सकते हैं।

लेकिन यह सिर्फ शुद्ध अटकलें हैं।
यह "मज़ेदार" होगा कि वह क्लास बनाने की कोशिश करे और अपने कंस्ट्रक्टर में lessFileSourceBaseयह देखे कि यह कैसे व्यवहार करता है।


1
आप शब्द मज़ा के आसपास उद्धरण याद किया;)
डेविड मैनर्स

1
@DavidManners। सही। मैंने ठीक कर दिया। :)
मेरियस

@ मार्स: यदि आप \Magento\Framework\Session\Genericस्रोत फ़ाइल को बदलने के लिए निर्भर करते हैं, तो Magento\Core\Model\Session\Storageइसके बजाय StorageInterfaceआपको 'क्लास मैगेंटो ' कोर \ "मॉडल \ सत्र \ संग्रहण 'मौजूद नहीं होना चाहिए। इसका कारण यह है कि ObjectManager virtualType का एक उदाहरण नहीं बनाता है, लेकिन बस यह निर्धारित करने के लिए कि तर्कों का निर्माण किस प्रकार के निर्माण के लिए प्रदान किया जाता है जो virtualType परिभाषा ( Magento\Framework\Session\Storageउपरोक्त उदाहरण के लिए) द्वारा संदर्भित है ।
क्रिस ओ'टोले

इसे फैक्ट्री में देख सकते हैं , जहाँ $requestedTypeआभासी प्रकार का प्रतिनिधित्व करता है और इसका उपयोग तर्कों को इकट्ठा करने के लिए किया जाता है, लेकिन $typeवह ठोस प्रकार है जो वर्चुअलाइज़ेशन कॉल के लिए मैप करने के लिए उपयोग किया जाता है।
क्रिस ओ'टॉले

यहां तक ​​कि अगर lessFileSourceBaseएक अधिक नामस्थान \ वर्ग प्रकार की शैली में था, तो यह एक और php वर्ग द्वारा सीधे संदर्भ के लिए अनुमति नहीं देगा, बस di.xml के माध्यम से इंजेक्शन के लिए
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.