İşte cevaplar
bu durumda neden bir vekil sınıf kullanılır?
Eğer "SetConversionValueObserver" sınıfı için yazılan kodun altına yakından bakarsanız, Google taraftarları aktif "return" değilse ve "return" emri yoksa. Araçlar, Sipariş Toplama Nesnesi yalnızca sipariş Kimlikleri varsa ve Google adwords etkin olduğunda oluşturulur. gerçek Sipariş toplama sınıfını enjekte edersek, nesne yöneticisi Google adwords’ünün etkin olmadığını ve sipariş başarı sayfasını yavaşlattığını bilmeden üst sınıf nesneleriyle toplama nesnesi oluşturur. yani, istek üzerine proxy kullanımı daha iyi nesne oluşturmak. /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;
}
genel olarak ne zaman bir proxy sınıfı kullanılmalıdır?
- Nesne oluşturmanın pahalı olacağını ve sınıfın yapıcısının özellikle kaynak yoğun olduğunu düşünüyorsanız Proxy sınıfını enjekte edin. - nesne oluşturma nedeniyle gereksiz performans etkisi istemediğinizde. - Belirli bir yöntemi her zaman değil, belirli bir yöntem çağırdığınızda nesne oluşturma gerektiğini hissettiğinizde. Örneğin, Düzen yapıcısı kaynak yoğun bir iştir.
Gerçek Mizanpaj yapıcısı vs düzen / proxy
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 kurucu, bir göz atın, hiçbir üst kurucu çağrıldı yanı sıra sadece düzeni sınıfı adı geçti böylece gerçek nesne oluşturma yöntemi çağrıldığında gerçekleşir.
/**
* 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;
}
Proxy sınıfının istek üzerine nesne oluşturma yöntemi vardır, _subject geçirilen sınıfın nesnesidir.
/**
* 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;
}
Ve yöntemi _subject kullanarak çağırdı.
/**
* {@inheritdoc}
*/
public function setGeneratorPool(\Magento\Framework\View\Layout\GeneratorPool $generatorPool)
{
return $this->_getSubject()->setGeneratorPool($generatorPool);
}