क्या Magento 2 में एक कारखाने की पीढ़ी को ट्रिगर करता है


39

Magento 2 में कई श्रेणी की फाइलें होती हैं जो या तो पूर्व-निर्मित होती हैं, या मक्खी पर उत्पन्न होती हैं। में रहते हैं

var/generated

इन उत्पन्न फ़ाइलों में फ़ैक्टरी कक्षाएं शामिल हैं। से प्रलेखन , यह मेरी समझ है कि एक प्रोग्रामर इन्स्तांत "गैर इंजेक्शन" वस्तुओं के लिए कारखाने कक्षाओं का उपयोग करता है। एक "गैर-इंजेक्शन योग्य" वस्तु एक ऐसी वस्तु है जिसे निर्भरता इंजेक्शन के माध्यम से नहीं जोड़ा जा सकता है __constructor, आमतौर पर क्योंकि इसके लिए उपयोगकर्ता इनपुट की आवश्यकता होती है।

प्रलेखन से स्पष्ट नहीं है कि कैसे Magento 2 जानता है कि यह एक कारखाना वर्ग उत्पन्न करने की आवश्यकता है। यह बिट

यदि रन-टाइम मोड या कंपाइलर में ऑब्जेक्ट मैनेजर द्वारा गैर-मौजूद फैक्ट्री का सामना किया जाता है, तो ऑब्जेक्ट मैनेजर फैक्ट्री उत्पन्न करता है।

अगर मैं ऑब्जेक्ट मैनेजर में फैक्ट्री क्लास (या, विस्तार से, निर्भरता इंजेक्शन __constructors में) का उपयोग करता हूं, तो यह आवाज़ करता है कि मैगेंटो 2 मेरे लिए इसे उत्पन्न करेगा। लेकिन वस्तु प्रबंधक कैसे जानता है कि मैं जिस चीज का अनुरोध कर रहा हूं वह एक कारखाना है?

इसके अलावा, सभी उत्पन्न वर्गों को स्वचालित रूप से उत्पन्न (या "संकलन") करने के लिए दो कमांड प्रतीत होते हैं। इनमें से किसी भी आदेश को चलाने से बड़ी संख्या में फ़ैक्टरी वर्ग उत्पन्न होते हैं। क्या विन्यास और / या कोड फाइलें आवश्यक कमांड ऑब्जेक्ट बनाने के लिए इन कमांडों को देख रही हैं?

मुझे पता है कि ऑब्जेक्ट मैनेजर और / या कमांड कोड को नीचे ले जाने से यह सब पता चल जाएगा, लेकिन मैं उस लंबी और कठिन यात्रा से बचने की उम्मीद कर रहा हूं।

जवाबों:


21

यह सब कैसे एक साथ काम करता है, इसके लिए कुछ दिलचस्प कोड स्थान: https://github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

विभिन्न प्रकारों के साथ, यहाँ से अधिकतर https://github.com/magento/magento2/tree/develop/lib/internal/Magento/Framework/ObjectManager/Code/Generator लेकिन यहाँ से भी https://github.com/magento आते हैं। / Magento2 / पेड़ / विकसित / lib / आंतरिक / Magento / फ्रेमवर्क / अवरोधन / कोड / अवरोधक कोड के लिए जनरेटर

यह सब ऑटोलैडर द्वारा शुरू किया गया है यहां https://github.com/magento/magento2/blob/develop/lib/intern/Magento/Framework/Code/Generator/Agoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

मुझे कोड नहीं मिला है, जिन स्थितियों के लिए कारखाने उत्पन्न होते हैं, लेकिन मेरी समझ से एक कारखाना वर्ग उत्पन्न होता है जब यह अनुरोध किया जाता है और नहीं मिलता है।
कुछ आरक्षित खोजशब्द हैं Factory, Proxy, Interceptor, यदि उपयोग किया जाता है, तो विशिष्ट वर्ग नहीं मिलने पर कोड पीढ़ी को ट्रिगर करेगा।
जैसे ही मुझे वह कोड मिलेगा, जो मुझे लगता है कि फैक्ट्री जनरेशन को ट्रिगर करता है।
इसलिए, यदि आप कक्षा का अनुरोध करते हैं Some\Namespace\HereFactoryऔर वर्ग मौजूद नहीं है, क्योंकि यह उस कीवर्ड के साथ समाप्त होता है जो Factoryइसमें उत्पन्न होगाvar/generation/Some/Namespace/HereFactory.php


लगता है कि डॉक्स को अपडेट किया जाना चाहिए क्योंकि ObjectManager वास्तव में एक उत्पन्न करने वाला नहीं है। विशेष ऑटो लोडर उत्तर का हिस्सा है। github.com/magento/magento2/blob/develop/lib/internal/Magento/…
क्रिस ओ'टोले

1
मेरे अनुभव के साथ यह रेखाएँ दिखाई देती हैं (देखें gist.github.com/astorm/f245ce9c761c9a8053aa), लेकिन यह प्रश्न 1 उठाता है। वस्तु प्रबंधक कोड में ऐसा कहां होता है (अर्थात वास्तविक सम्मेलन क्या है। 2. संकलक / कैसे करता है) जनरेटर क्या कारखानों को पता है?
एलन स्टॉर्म

8

मैं अभी इसी मटर के सूप में खुदाई कर रहा हूं। मेरी अब तक की समझ यह है कि जिन सभी सामानों पर ऑटो उत्पन्न /var/generationहोता है, उन्हें प्राथमिकताओं और इंटरफेस में घोषित किया जाता है app/etc/di.xml

di.xmlआपकी फ़ाइल में इंटरफेसेस और प्राथमिकताएँ घोषित होने वाली हैं /app/code/Vendor/<module>/etc/di.xml

यह आपके लिए ऑब्जेक्ट (एस) उत्पन्न करना जानता है क्योंकि आपने अपने __constructorएंड में इंटरफ़ेस की घोषणा की है और उस इंटरफ़ेस के लिए या तो वैश्विक रूप से या स्थानीय रूप से उपयुक्त di.xmlफ़ाइल में वरीयता की घोषणा की है ।

मैं अपनी टिप्पणियों के साथ नमक के तीन दाने पेश करता हूं।


उपयोगी जानकारी के लिए +1 - लेकिन ऐसा लगता है कि फ़ैक्टरी di.xmlफ़ाइलों के अलावा कहीं और से आती हैं - आप किसी वस्तु प्रबंधक में कुछ भेज सकते हैं जो फैक्टरी में समाप्त होती है और यह आपके लिए एक फ़ाइल उत्पन्न करेगी।
एलन स्टॉर्म

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