Ось відповіді
чому клас проксі використовується саме в цьому випадку?
Якщо ви уважно подивіться нижче коду, який написаний для класу "SetConversionValueObserver", якщо Google adwards не активний, "повернутися" і якщо немає замовлення "повернути". Значить, Об'єкт колекції замовлень буде створений лише тоді, коли існують ідентифікатори замовлення та активовано Google adwords. якщо ми вводимо фактичний клас колекції замовлень, тоді менеджер об'єктів створює об’єкт колекції з об'єктами свого батьківського класу, не знаючи, що Google adwords не активні, і це уповільнює сторінку успішного замовлення. Отже, краще створити об’єкт на вимогу, який полягає у використанні проксі. /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);
}