Sesuatu yang saya perhatikan baru-baru ini dan saya ingin tahu tentang hal itu.
Contoh 1: penggunaan getEvent()
Di Mage_Core_Model_Locale
dalam setLocale()
metode, sebuah acara dikirim:
Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));
Pengamat untuk acara ini bindLocale()
berasal dariMage_Adminhtml_Model_Observer
public function bindLocale($observer)
{
if ($locale=$observer->getEvent()->getLocale()) {
if ($choosedLocale = Mage::getSingleton('adminhtml/session')->getLocale()) {
$locale->setLocaleCode($choosedLocale);
}
}
return $this;
}
Jadi seperti yang Anda lihat, untuk mengambil lokasi, pertama-tama kita memanggil getEvent()
pengamat.
Contoh 2: tanpa getEvent()
Di Mage_Wishlist_Block_Customer_Wishlist_Item_Options
dalam __construct()
metode, sebuah acara dikirim:
Mage::dispatchEvent('product_option_renderer_init', array('block' => $this));
Jadi kami setuju bahwa sintaks yang sama digunakan untuk contoh 1 dan 2.
Namun, pengamat untuk contoh kedua ini initOptionRenderer()
dariMage_Bundle_Model_Observer
public function initOptionRenderer(Varien_Event_Observer $observer)
{
$block = $observer->getBlock();
$block->addOptionsRenderCfg('bundle', 'bundle/catalog_product_configuration');
return $this;
}
Dan seperti yang Anda lihat, untuk mengambil blok, kami tidak memanggil getEvent()
pengamat
Pertanyaan
- Mengapa
getEvent()
metode ini disebut dalam contoh # 1? Atau mengapagetEvent()
tidak disebut dalam contoh # 2? - Apa tujuan dari
getEvent()
metode ini? - Di mana satu harus digunakan
getEvent()
dan di mana seharusnya tidak menggunakannya?
sumber
Satu hal yang jelas.
Menelepon
$observer->getEvent()->getSomething()
dan$observer->getSomething()
mengembalikan hal yang sama.Lihatlah
Mage_Core_Model_App::dispatchEvent
metodenya.Pada satu titik Anda memiliki di
$event = new Varien_Event($args);
mana$args
argumen dilewatkan kedispatchEvent
metodeDan
Varien_Event
meluasVarien_Object
sehingga Anda dapat secara ajaib mengakses elemen$args
dariVarien_Event
instance.tetapi ada juga baris ini di
$observer->addData($args);
mana$args
hal-hal yang sama seperti di atas.Varien_Event_Observer
juga meluasVarien_Object
sehingga ini memungkinkan Anda untuk secara ajaib mengakses elemen$args
melalui objek Observer.Kesimpulan:
The
$_data
anggota di kelas Observer dan kelas Acara mengandung jenis hal yang sama. Pengamat juga memiliki beberapa bidang lainnya. sepertievent
,event_name
.Katakanlah
$args
tampilan seperti ini:Saat mengirim acara, objek
$_data
dalam acara akan terlihat seperti ini:dan di kelas Observer akan terlihat seperti ini:
Tetapi saya tidak bisa menjawab mengapa kurangnya konsistensi ini ada.
Saya hanya dapat berspekulasi bahwa kode ini ditulis oleh 2 pengembang yang berbeda.
Jika itu layak sesuatu, saya selalu gunakan
$observer->getEvent()->getSomething()
.[EDIT]
Kurangnya konsistensi
The
Varien_Event
obyek harus objek pembungkus atas argumen dilewatkan ke pengamatsumber
$observer->getEvent()
untuk mengambil data apa pun di pengamat. Saya tahu kami dapat mengambil data dari$observer
langsung. Tapi saya tidak melakukan itu karena saya selalu merasa, injeksi objekVarien_Event
sangat spesifik untuk menyimpan data acara. Karenanya saya selalu bergantung pada objek acara. Saya merasa itu pendekatan yang benar.getEvent()
kecuali jika Anda memerlukan nama acara ATAU ingin kompatibel dengan Magento 1.0Penjelasan tentang kurangnya konsistensi.
Menurut Vinai dan apa yang dikatakan Vitaly Korotun kepadanya di beberapa titik:
Jadi, jika Anda tidak perlu
event_name
dan tidak terlalu peduli tentang kode Anda yang kompatibel dengan Magento 1.0, Anda dapat meninggalkannyagetEvent()
.sumber