ठीक है, इसलिए कल हमने कक्षाओं / टेम्पलेट्स के प्रत्यक्ष उपयोग केObjectManager
बारे में मैगेंटो समुदाय के अन्य लोगों के साथ एक बड़ी बातचीत की ।
मैं पहले से ही उन कारणों से अवगत हूं कि हम एलन केंट के हवाले से सीधे ObjectManager का उपयोग क्यों नहीं करें :
इसके कई कारण हैं। कोड काम करेगा, लेकिन ObjectManager वर्ग को सीधे संदर्भित नहीं करना सबसे अच्छा अभ्यास है।
- क्योंकि हम ऐसा कहते हैं! ;-) (बेहतर कोड के रूप में व्यक्त किया गया अच्छा कोड है)
- कोड का उपयोग भविष्य में एक अलग निर्भरता इंजेक्शन ढांचे के साथ किया जा सकता है
- परीक्षण आसान है - आप एक आवश्यक ऑब्जेक्ट प्रबंधक प्रदान किए बिना, आवश्यक वर्ग के लिए नकली तर्क में पास होते हैं
- यह निर्भरता को स्पष्ट रखता है - यह स्पष्ट है कि कोड कोड के बीच में छिपी निर्भरता होने के बजाए, निर्माता सूची के माध्यम से निर्भर करता है
- यह प्रोग्रामर्स को इनकैप्सुलेशन और मॉडर्लाइजेशन जैसी अवधारणाओं के बारे में सोचने के लिए प्रोत्साहित करता है - अगर कंस्ट्रक्टर बड़ा हो जाता है, तो शायद यह एक संकेत है कि कोड को रिफैक्टिंग करने की आवश्यकता है
मैंने StackExchange में जो देखा है, उससे बहुत सारे लोग उदाहरण के लिए आसान / संक्षिप्त / अनुशंसित नहीं समाधान के लिए जाते हैं:
<?php
//Get Object Manager Instance
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
//Load product by product id
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($id);
इसके बजाय दर्दनाक लेकिन अनुशंसित प्रक्रिया से गुजरने के बाद :
- एक मॉड्यूल बना रहा है
- वरीयताएँ घोषित करना
- निर्भरता को इंजेक्ट करें
- एक सार्वजनिक विधि घोषित करें
हालाँकि, और यहाँ दुविधा आती है, Magento 2 कोर फाइलें अक्सर ObjectManager को सीधे कॉल करती हैं । एक त्वरित उदाहरण यहां पाया जा सकता है: https://github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php4L57
तो यहाँ मेरे सवाल हैं:
- क्यों Magento कर रही है वे हमें क्या नहीं करने के लिए सलाह देते हैं? क्या इसका मतलब यह है कि कुछ मामले हैं जहां हमें
ObjectManager
सीधे उपयोग करना चाहिए ? यदि हां, तो वे मामले क्या हैं? - सीधे ObjectManager का उपयोग करने के परिणाम क्या हैं ?
The intent of zend-servicemanager is for use as an Inversion of Control container. It was never intended as a general purpose service locator [...]
। यह M2 पर भी लागू होता है। इसके अलावा, There are valid use cases
अनुभाग की जांच करें , जो फिर से, यहां भी लागू होता है।