Kelas interceptor adalah implementasi dari pola desain interceptor . Pencegat adalah bagaimana cara sistem objek Magento 2 mengimplementasikan sistem plugin .
Sebagai pengembang klien, teorinya adalah Anda tidak perlu khawatir tentang pencegat - Anda meminta objek manager tipe objek X, dan mengembalikannya kepada Anda. Objek yang Anda minta mungkin atau mungkin bukan pencegat, tetapi dari sudut pandang pemrogram klien berperilaku sama dengan versi non-pencegat. Bagaimana manajer objek memutuskan untuk kembali atau tidak mengembalikan interseptor dalam detail implementasi.
Untuk orang yang tertarik pada detail implementasi - jika kelas, atau kelas induk dari kelas itu, memiliki plugin yang dikonfigurasi, manajer objek mengembalikan interseptor. Anda dapat melihatnya di kelas interceptor mode pengembang di sini
#File: vendor/magento/framework/Interception/ObjectManager/Config/Developer.php
public function getInstanceType($instanceName)
{
$type = parent::getInstanceType($instanceName);
if ($this->interceptionConfig && $this->interceptionConfig->hasPlugins($instanceName)
&& $this->interceptableValidator->validate($instanceName)
) {
return $type . '\\Interceptor';
}
return $type;
}
Untuk produksi (yaitu mode terkompilasi), Magento melakukan pra-scan sistem selama mode kompilasi, dan membuat catatan kelas mana yang membutuhkan plugin.
Adapun generasi yang sebenarnya, Magento menangani ini dengan autoloader PHP. Jika pengembang membuat instance kelas (atau memicu acara pengisian-otomatis PHP dengan nama kelas (dalam petunjuk jenis, class_exists
kelas, dll.), Dan autoloader berbasis komposer tidak dapat menemukan file kelas, autoloader kedua yang terdaftar
Magento\Framework\Code\Generator\Autoloader::load
dipicu. Autoloader ini
vendor/magento/framework/Code/Generator/Autoloader.php
akan (secara tidak langsung melalui Magento\Framework\Code\Generator
kelas) memindai kelas untuk pola penamaan tertentu. Jika nama kelas berakhir Interceptor
, Magento akhirnya menghasilkan Interceptor melalui generateClass
metode di kelas ini
vendor/magento/framework/Code/Generator.php
Ada kelas / objek tambahan untuk dilacak dari Magento\Framework\Code\Generator
- tapi kami akan meninggalkannya sebagai latihan untuk pembaca.