Đây là những câu trả lời
Tại sao một lớp proxy được sử dụng trong trường hợp cụ thể đó?
Nếu bạn xem kỹ mã bên dưới được viết cho lớp "SetConversionValueObserver", nếu Google adwards không hoạt động "return" và nếu không có lệnh "return". Phương tiện, Đối tượng thu thập đơn hàng sẽ chỉ được tạo khi Id đơn hàng tồn tại và Google adwords hoạt động. nếu chúng ta chèn lớp bộ sưu tập Đơn hàng thực tế thì trình quản lý đối tượng tạo đối tượng bộ sưu tập với các đối tượng lớp cha của nó mà không biết Google adwords không hoạt động và điều đó làm chậm trang thành công của đơn hàng. vì vậy, tốt hơn nên tạo đối tượng theo yêu cầu đó là sử dụng proxy. /vendor/magento/module-google-AHA/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;
}
Khi nào, nói chung, khi nào nên sử dụng một lớp proxy?
- Tiêm lớp Proxy khi bạn cảm thấy việc tạo đối tượng sẽ tốn kém và hàm tạo của lớp đặc biệt tốn nhiều tài nguyên. - khi bạn không muốn tác động hiệu suất không cần thiết do tạo đối tượng. - khi bạn cảm thấy việc tạo đối tượng sẽ xảy ra khi bạn gọi phương thức cụ thể trong điều kiện cụ thể không phải lúc nào cũng. Ví dụ: Trình xây dựng bố cục là một tài nguyên chuyên sâu.
Trình tạo bố cục thực tế so với layout / 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;
}
Trình xây dựng proxy, hãy xem, không có hàm tạo cha mẹ nào được gọi cũng như chỉ truyền tên lớp bố cục để việc tạo đối tượng thực tế xảy ra khi phương thức được gọi.
/**
* 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;
}
Lớp proxy có phương thức để tạo đối tượng theo yêu cầu, _subject là đối tượng của lớp đã qua.
/**
* 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;
}
Và phương thức được gọi là sử dụng _subject.
/**
* {@inheritdoc}
*/
public function setGeneratorPool(\Magento\Framework\View\Layout\GeneratorPool $generatorPool)
{
return $this->_getSubject()->setGeneratorPool($generatorPool);
}