Magento2 विशिष्ट ExtensionFactory और ExtensionAttributeInterface कैसे उत्पन्न करता है?


28

मैं विस्तार विशेषताओं का उपयोग करके अपने सिर को लपेटना चाहूंगा, उदाहरण के लिए उद्धरण आइटम।
Magento 1 में सेटअप वर्ग का उपयोग करके ऐसी इकाई में एक कस्टम विशेषता जोड़ने में कोई समस्या नहीं है, यह वह नहीं है जो यह सवाल है।
इस समय जादू मुझे अभिभूत कर देता है जब मैं एक ऐसी विशेषता को उजागर करना चाहता हूं जिसे संस्थाओं द्वारा एक्सटेंशन एक्सटेंशन के रूप में एपीआई के माध्यम से जोड़ा गया था।

अद्यतन : मुझे पता है कि नियमित कारखाने कैसे उत्पन्न होते हैं। यह प्रश्न उन विशेष कारखानों के बारे में है जो उत्पन्न विस्तार विशेषता इंटरफेस के लिए उत्पन्न कार्यान्वयन को तत्काल करते हैं।

यहां मैं काम करने के लिए कदम उठाता हूं। मैं इन्हें जोड़ रहा हूं ताकि जो कोई भी उत्तर देने का प्रयास करे, उन्हें उन विवरणों में जाने की आवश्यकता न हो।
मेरा प्रश्न है कैसे या क्यों यह काम करता है।

एक इकाई एपीआई के माध्यम से एक एक्सटेंशन विशेषता को उजागर करने के लिए कदम:

  1. etc/extension_attributes.xmlइकाई इंटरफ़ेस में विशेषता को जोड़ता है बनाएँ
  2. संस्थाओं के ExtensionAttributesउदाहरण के लिए विशेषता मान जोड़ने के लिए एक प्लगइन बनाएं ।

दूसरा बिंदु करने के लिए, संस्थाओं को ExtensionAttributesउदाहरण की आवश्यकता है। इस कारण से प्लगइन एक कारखाने पर निर्भर करता है, जिसे ऑब्जेक्ट मैनेजर DI के माध्यम से आपूर्ति करता है।

उद्धरण आइटम के लिए उदाहरण Magento\Quote\Api\Data\CartItemExtensionFactoryका उपयोग करना होगा।
मुझे लगता है कि इस कारखाने का प्रकार किसी भी तरह से पीढ़ी के जादू के लिए ट्रिगर होना चाहिए।

Magento तब \Magento\Quote\Api\Data\CartItemExtensionInterfaceसभी एक्सटेंशन विशेषताओं के लिए बसने और पाने वालों के साथ मिलान इंटरफ़ेस उत्पन्न करता है ।
हालाँकि, यह उस इंटरफ़ेस के लिए ठोस कार्यान्वयन उत्पन्न नहीं करता है। पट्टे पर PHPStorm इसे नहीं देख रहा है।

मैगेंटो उस जानकारी को कैसे इकट्ठा करता है जो उसे कक्षा उत्पन्न करने के लिए चाहिए? जेनरेट किए गए इंटरफ़ेस तरीकों को एक ठोस उदाहरण पर कैसे कहा जा सकता है? क्या यह ऐसा वर्ग है जो केवल स्मृति में उत्पन्न होता है?

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

अद्यतन 2 : के माध्यम से पढ़ने के लिए थोड़ा समय लिया \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGeneratorऔर \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator। अब मुझे कम से कम एक विचार है कि क्या चल रहा है। अगर कोई मुझे नहीं मारता है तो मैं एक बिंदु पर पूरी प्रक्रिया का वर्णन लिखूंगा, क्योंकि मुझे लगता है कि यह एक उपयोगी संदर्भ होगा।


2
Vinai .. किया था सवाल ..Omg पूछा
अमित बेरा

जवाबों:


26

सभी autogeneration के प्रथम श्रेणी के नाम प्रत्यय, जैसे के आधार पर हो रहा है Factory, ExtensionInterface(देखें \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::EXTENSION_INTERFACE_SUFFIX) या Extension(देखें \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator::EXTENSION_SUFFIX)।

यहां प्रत्यय के आधार पर उचित जनरेटर का चयन किया जाता है \Magento\Framework\Code\Generator::generateClass

मान लेते हैं कि Magento मोड है developerऔर लापता कक्षाएं मक्खी पर उत्पन्न हो सकती हैं (इसी तरह की प्रक्रिया तब होती है जब कंपाइलर का उपयोग किया जाता है)। जब ऑब्जेक्ट प्रबंधक तुरंत कहने की कोशिश करता है Magento\Quote\Api\Data\CartItemExtensionFactoryऔर यह मौजूद नहीं है, तो निम्न होता है:

  1. ऑटोलैडर कक्षा को तत्काल करने में विफल रहता है और यहां कोड जनरेशन शुरू करता है \Magento\Framework\Code\Generator\Autoloader::load
  2. तब वर्ग प्रत्यय के रूप में निर्धारित किया जाता है Factory(सभी घोषित प्रत्ययों की सूची यहां पाई जा सकती है \Magento\Framework\ObjectManager\DefinitionFactory::getCodeGenerator) और इसी कारखाने के जनरेटर जनरेटर वर्ग ( Magento\Framework\ObjectManager\Code\Generator\Factory) का उपयोग कारखाना बनाने के लिए किया जाता है
  3. सभी ऑटोजेनरेटेड कक्षाएं हमेशा अन्य वर्गों पर आधारित होती हैं, कारखाने के मामले में, स्रोत वर्ग के नाम की गणना Factoryप्रत्यय को हटाकर की जाती है, यह होगा Magento\Quote\Api\Data\CartItemExtension। यह वर्ग मौजूद नहीं है और ऑटोलॉग्रेशन द्वारा ऑटोगेनेरेशन को एक बार फिर से लागू किया जाता है, लेकिन इस बार एक्सटेंशन क्लास के लिए
  4. अब प्रत्यय है Extensionऔर \Magento\Framework\Api\Code\Generator\ExtensionAttributesGeneratorइसका उपयोग इस वर्ग को उत्पन्न करने के लिए किया जाएगा
  5. एक्सटेंशन क्लास पीढ़ी के लिए स्रोत वर्ग की गणना की जाती है Magento\Quote\Api\Data\CartItemInterface, यह मौजूद है और एक्सटेंशन क्लास सफलतापूर्वक उत्पन्न होता है। हालाँकि, एक्सटेंशन क्लास फ़ाइल को शामिल करने के प्रयास पर, एक बार फिर से ऑटोगेनेरेशन को ट्रिगर किया जाता है क्योंकि Magento\Quote\Api\Data\CartItemExtensionलागू Magento\Quote\Api\Data\CartItemExtensionInterfaceनहीं होता है, जो मौजूद नहीं है
  6. प्रत्यय है ExtensionInterfaceऔर \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGeneratorइसका उपयोग पीढ़ी के लिए किया जाएगा
  7. ExtensionInterface और एक्सटेंशन क्लासेस की जानकारी के आधार पर उत्पन्न होती है extension_attributes.xml, जिसके माध्यम से सुलभ होती है \Magento\Framework\Api\ExtensionAttribute\Config, फिर फैक्टरी उत्पन्न होती है

एक महत्वपूर्ण बात यह है कि ExtensionInterface के लिए कोई प्राथमिकता नहीं है di.xmlक्योंकि Extension और ExtensionInterface दोनों को ऑटोजेनर किया गया है। यह कोई समस्या नहीं है क्योंकि ExtentionInterface के सीधे निर्माण के माध्यम से इंजेक्ट होने की उम्मीद नहीं है।


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

0

मेरे लिए, आज रात, @ एलेक्स के जवाब के शीर्ष पर, मैं लाइनें देख सकता हूं

$modelReflection = new \ReflectionClass($extensibleClassName);
        if ($modelReflection->isInterface()
            && $modelReflection->isSubclassOf(self::EXTENSIBLE_INTERFACE_NAME)
            && $modelReflection->hasMethod('getExtensionAttributes')
        ) {
            $this->classInterfaceMap[$extensibleClassName] = $extensibleClassName;
            return $this->classInterfaceMap[$extensibleClassName];
        }

कक्षा मैं \Magento\Framework\Api\ExtensionAttributesFactory

अगर हम एक्सटेंशन इंटरफ़ेस जेनरेट नहीं कर रहे हैं तो हम डिबगिंग शुरू करना चाहते हैं। बहुत अधिक विस्तार विशेषताएँ हमारे वर्ग को संरचित करने के बारे में हैं जैसे कि Magento 2 उम्मीद करेगा।

ये पंक्तियाँ कह रही हैं:

  • हमारे extension_attributes में क्लास एक इंटरफ़ेस है

  • क्या यह \ Magento \ Framework \ Api \ ExtensibleDataInterface का विस्तार करता है

  • इस इंटरफ़ेस में एक फ़ंक्शन है, जिसे getExtensionAttributes कहा जाता है

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