Inilah jawabannya
mengapa kelas proxy digunakan dalam kasus khusus itu?
Jika Anda melihat dari dekat kode di bawah ini yang ditulis untuk kelas "SetConversionValueObserver", jika Google adwards tidak aktif "kembali" dan jika tidak ada pesanan "kembali". Berarti, Objek Pengumpulan Pesanan akan dibuat hanya jika Id ada dan Google adwords aktif. jika kita menyuntikkan kelas koleksi pesanan aktual maka manajer objek membuat objek koleksi dengan objek kelas induknya tanpa mengetahui Google adwords tidak aktif dan memperlambat halaman keberhasilan pesanan. jadi, lebih baik buat objek sesuai permintaan yaitu penggunaan proxy. /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;
}
kapan, secara umum, haruskah seseorang menggunakan kelas proxy?
- Suntikkan kelas Proxy ketika Anda merasa pembuatan objek akan mahal dan konstruktor kelas sangat membutuhkan sumber daya. - ketika Anda tidak ingin dampak kinerja yang tidak perlu karena pembuatan objek. - ketika Anda merasa penciptaan objek harus terjadi ketika Anda memanggil metode tertentu dalam kondisi tertentu tidak selalu. Misalnya konstruktor Tata Letak adalah sumber daya-intensif.
Konstruktor Tata Letak Aktual vs tata letak / 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 konstruktor, lihatlah, tidak ada induk konstruktor yang dipanggil serta hanya melewati nama kelas tata letak sehingga penciptaan objek aktual terjadi ketika metode dipanggil.
/**
* 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;
}
Kelas proxy memiliki metode untuk membuat objek sesuai permintaan, _subjek adalah objek dari kelas yang lulus.
/**
* 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;
}
Dan metode yang disebut menggunakan _subject.
/**
* {@inheritdoc}
*/
public function setGeneratorPool(\Magento\Framework\View\Layout\GeneratorPool $generatorPool)
{
return $this->_getSubject()->setGeneratorPool($generatorPool);
}