Di Magento 2, $this
variabel tidak lagi merujuk ke objek blok template. Ini merujuk ke kelas templat
Magento\Framework\View\TemplateEngine\Php
Namun, kelas templat ini memiliki __call
metode passthrough
#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
return call_user_func_array([$this->_currentBlock, $method], $args);
}
Yang memastikan setiap panggilan metode berhasil masuk ke blok sebenarnya. Ini juga menjelaskan mengapa Anda tidak dapat memanggil metode yang dilindungi dari phtml
template.
Selain itu, setiap templat (saya pikir?) Memiliki variabel bernama $block
populated, yang juga merujuk ke objek induk blok. Anda dapat melihat ini digunakan dalam template daftar Magento
#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();
di mana $block
variabel digunakan, tetapi tidak pernah didefinisikan secara eksplisit.
Selain perbedaan yang disebutkan di atas, apakah ada perbedaan antara menggunakan satu teknik di atas yang lain? yaitu Melakukan keduanya $block
dan $this->currentBlock
merujuk ke objek yang sama?
$block
Sejauh yang saya lihat mereka berdua hampir sama di PHP TemplateEngineInterface, tetapi ingat bahwa di Magento2 Anda dapat membuat mesin templat kustom. Tidak seperti Magento1 di mana Anda baru saja memiliki file phtml.
Jika Anda melihat
TemplateEngineInterface
Anda tidak dapat melihat referensi ke metode apa pun yang memanggilcurrentBlock
, jadi saya pikir$this->currentBlock
pendekatannya adalah templat PHP khusus.Tetapi untuk menjadi independen dari mesin templat,
$block
harus pendekatan yang benar.Maksud saya, dari sudut pandang teoretis, Anda dapat membuat mesin berbasis PHP yang berbeda yang tidak dapat mengandalkan file phtml, tetapi mungkin pada beberapa struktur PHP lainnya.
Saya menganggap
$block
sebagai cara "benar" untuk mode "phtml" karena secara eksplisit dilewatkan sebagai variabel konteks.$block
dan$this->currentBlock
sama dari sudut pandang teknis, tetapi jika mereka menggunakan secara eksplisit$block
saya pikir kita harus menggunakannya, dari sudut pandang kode-styling.sumber