यहाँ उत्तर हैं
उस विशेष मामले में एक प्रॉक्सी क्लास का उपयोग क्यों किया जाता है?
यदि आप कोड के नीचे एक नज़दीकी नज़र रखते हैं, जो कि क्लास के लिए लिखा गया है "SetConversionValueObserver", अगर Google adwards सक्रिय नहीं है "वापसी" और अगर कोई आदेश नहीं है "वापसी"। मतलब, ऑर्डर कलेक्शन ऑब्जेक्ट केवल तब बनाया जाएगा जब ऑर्डर आईड्स मौजूद हों और Google ऐडवर्ड्स सक्रिय हो। यदि हम वास्तविक ऑर्डर कलेक्शन क्लास को इंजेक्ट करते हैं, तो ऑब्जेक्ट मैनेजर Google ऐडवर्ड्स को सक्रिय किए बिना अपने मूल वर्ग ऑब्जेक्ट्स के साथ संग्रह ऑब्जेक्ट बनाता है जो कि सक्रिय नहीं है और ऑर्डर सफलता पृष्ठ को धीमा कर देता है। इसलिए, मांग पर बेहतर वस्तु बनाएं जो प्रॉक्सी का उपयोग हो। /vendor/magento/module-google-adwords/Observer/SetConversionValueObserver.php
/**
* Set base grand total of order to registry
*
* @param \Magento\Framework\Event\Observer $observer
* @return \Magento\GoogleAdwords\Observer\SetConversionValueObserver
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
if (!($this->_helper->isGoogleAdwordsActive() && $this->_helper->isDynamicConversionValue())) {
return $this;
}
$orderIds = $observer->getEvent()->getOrderIds();
if (!$orderIds || !is_array($orderIds)) {
return $this;
}
$this->_collection->addFieldToFilter('entity_id', ['in' => $orderIds]);
$conversionValue = 0;
/** @var $order \Magento\Sales\Model\Order */
foreach ($this->_collection as $order) {
$conversionValue += $order->getBaseGrandTotal();
}
$this->_registry->register(
\Magento\GoogleAdwords\Helper\Data::CONVERSION_VALUE_REGISTRY_NAME,
$conversionValue
);
return $this;
}
जब सामान्य तौर पर, किसी को प्रॉक्सी क्लास का उपयोग करना चाहिए?
- प्रॉक्सी वर्ग इंजेक्षन जब आपको लगता है कि वस्तु निर्माण महंगा होगा और वर्ग का निर्माण विशेष रूप से संसाधन-गहन है। - जब आप ऑब्जेक्ट निर्माण के कारण अनावश्यक प्रदर्शन प्रभाव नहीं चाहते हैं। - जब आपको लगता है कि वस्तु निर्माण तब होना चाहिए जब आप किसी विशेष स्थिति में विशेष विधि को हमेशा नहीं कहते हैं। उदाहरण के लिए लेआउट कंस्ट्रक्टर एक संसाधन-गहन है।
वास्तविक लेआउट निर्माता बनाम लेआउट / प्रॉक्सी
public function __construct(
Layout\ProcessorFactory $processorFactory,
ManagerInterface $eventManager,
Layout\Data\Structure $structure,
MessageManagerInterface $messageManager,
Design\Theme\ResolverInterface $themeResolver,
Layout\ReaderPool $readerPool,
Layout\GeneratorPool $generatorPool,
FrontendInterface $cache,
Layout\Reader\ContextFactory $readerContextFactory,
Layout\Generator\ContextFactory $generatorContextFactory,
AppState $appState,
Logger $logger,
$cacheable = true,
SerializerInterface $serializer = null
) {
$this->_elementClass = \Magento\Framework\View\Layout\Element::class;
$this->_renderingOutput = new \Magento\Framework\DataObject();
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
$this->_processorFactory = $processorFactory;
$this->_eventManager = $eventManager;
$this->structure = $structure;
$this->messageManager = $messageManager;
$this->themeResolver = $themeResolver;
$this->readerPool = $readerPool;
$this->generatorPool = $generatorPool;
$this->cacheable = $cacheable;
$this->cache = $cache;
$this->readerContextFactory = $readerContextFactory;
$this->generatorContextFactory = $generatorContextFactory;
$this->appState = $appState;
$this->logger = $logger;
}
प्रॉक्सी कंस्ट्रक्टर, एक नज़र डालें, कोई भी पैरेंट कंस्ट्रक्टर नहीं जिसे केवल लेआउट क्लास का नाम दिया गया हो ताकि वास्तविक ऑब्जेक्ट क्रिएशन तब हो जब उसे कॉल किया जाता है।
/**
* Proxy constructor
*
* @param \Magento\Framework\ObjectManagerInterface $objectManager
* @param string $instanceName
* @param bool $shared
*/
public function __construct(
\Magento\Framework\ObjectManagerInterface $objectManager,
$instanceName = \Magento\Framework\View\Layout::class,
$shared = true
) {
$this->_objectManager = $objectManager;
$this->_instanceName = $instanceName;
$this->_isShared = $shared;
}
प्रॉक्सी क्लास में डिमांड पर ऑब्जेक्ट बनाने की विधि है, _subject पास क्लास की ऑब्जेक्ट है।
/**
* Get proxied instance
*
* @return \Magento\Framework\View\Layout
*/
protected function _getSubject()
{
if (!$this->_subject) {
$this->_subject = true === $this->_isShared
? $this->_objectManager->get($this->_instanceName)
: $this->_objectManager->create($this->_instanceName);
}
return $this->_subject;
}
और विधि _subject का उपयोग करके कहा जाता है।
/**
* {@inheritdoc}
*/
public function setGeneratorPool(\Magento\Framework\View\Layout\GeneratorPool $generatorPool)
{
return $this->_getSubject()->setGeneratorPool($generatorPool);
}