Magento 1: mengapa beberapa metode pengamat memanggil getEvent () dan beberapa tidak?

8

Sesuatu yang saya perhatikan baru-baru ini dan saya ingin tahu tentang hal itu.

Contoh 1: penggunaan getEvent()

Di Mage_Core_Model_Localedalam 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_Optionsdalam __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 mengapa getEvent()tidak disebut dalam contoh # 2?
  • Apa tujuan dari getEvent()metode ini?
  • Di mana satu harus digunakan getEvent()dan di mana seharusnya tidak menggunakannya?
Raphael di Digital Pianism
sumber

Jawaban:

7

Mungkin memiliki alasan historis, mencapai kembali melampaui rilis 1.0.

The Varien_Eventobjek adalah tempat yang logis untuk berisi parameter untuk acara beton, tapi karena Magento melewati Varien_Observerobjek untuk semua metode pengamat, akses pintas parameter masuk akal (dan telah ada setidaknya sejak 1,1).

Saya sebenarnya tidak melihat nilai pada dua objek berbeda seperti yang digunakan hari ini .

Tapi itu jelas tidak direncanakan seperti itu sejak awal. Dalam metode ini Mage::addObserver(), tidak hanya peristiwa dan nama pengamat dan argumen statis dari <args>simpul XML yang ditetapkan, tetapi juga panggilan balik:

$observer->setName($observerName)->addData($data)->setEventName($eventName)->setCallback($callback);

Dengan cara ini, para pengamat dapat mengirim sendiri $observer->dispatch($event). Dalam hal ini, pengamat tidak akan memiliki data acara sendiri dan Anda perlu Anda gunakan getEvent()untuk mengaksesnya. Tetapi metode ini tidak digunakan di mana pun, jadi dalam praktiknya tidak masalah.

Jika Anda ingin mempraktikkan arkeologi perangkat lunak dan menggali lebih banyak, Anda akan menemukan lebih banyak kode mati yang mengisyaratkan gagasan orisinal yang tidak pernah berhasil masuk ke produk akhir, seperti Varien_Event_Observer_Collection.

Fabian Schmengler
sumber
Terima kasih. Akan menyebutkan tentang aspek "historis". Sepertinya Anda melakukan itu untuk kami :)
Rajeev K Tomy
8

Satu hal yang jelas.

Menelepon $observer->getEvent()->getSomething()dan $observer->getSomething()mengembalikan hal yang sama.

Lihatlah Mage_Core_Model_App::dispatchEventmetodenya.

Pada satu titik Anda memiliki di $event = new Varien_Event($args);mana $argsargumen dilewatkan ke dispatchEventmetode
Dan Varien_Eventmeluas Varien_Objectsehingga Anda dapat secara ajaib mengakses elemen $argsdari Varien_Eventinstance.

tetapi ada juga baris ini di $observer->addData($args);mana $argshal-hal yang sama seperti di atas.

Varien_Event_Observerjuga meluas Varien_Objectsehingga ini memungkinkan Anda untuk secara ajaib mengakses elemen $argsmelalui objek Observer.

Kesimpulan:

The $_dataanggota di kelas Observer dan kelas Acara mengandung jenis hal yang sama. Pengamat juga memiliki beberapa bidang lainnya. seperti event, event_name.

Katakanlah $argstampilan seperti ini:

array(
   'some_arg' => 'someArg',
   'other_arg' => 'otherArg',
)

Saat mengirim acara, objek $_datadalam acara akan terlihat seperti ini:

array(
   'some_arg' => 'someArg',
   'other_arg' => 'otherArg',
   'name' => 'event name here'
)

dan di kelas Observer akan terlihat seperti ini:

array(
   'some_arg' => 'someArg',
   'other_arg' => 'otherArg',
   'event_name' => 'event name here',
   'event' => instance of Varien_event,
   'callback' => ..., 
   'name' => 'observer name here'
)

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]

Mengapa metode getEvent () disebut dalam contoh # 1? Atau mengapa getEvent () tidak dipanggil dalam contoh # 2?

Kurangnya konsistensi

Apa tujuan dari metode getEvent ()?

The Varien_Eventobyek harus objek pembungkus atas argumen dilewatkan ke pengamat

Di mana satu harus menggunakan getEvent () dan di mana seharusnya tidak menggunakannya? Gunakan mereka sesuka Anda. Anda akan mendapatkan hasil yang sama sepanjang waktu.

Marius
sumber
Mendapat penjelasan tentang kurangnya konsistensi, lihat jawaban saya
Raphael di Digital Pianism
Saya selalu perfer $observer->getEvent()untuk mengambil data apa pun di pengamat. Saya tahu kami dapat mengambil data dari $observerlangsung. Tapi saya tidak melakukan itu karena saya selalu merasa, injeksi objek Varien_Eventsangat spesifik untuk menyimpan data acara. Karenanya saya selalu bergantung pada objek acara. Saya merasa itu pendekatan yang benar.
Rajeev K Tomy
@RajeevKTomy lihat jawaban saya, sebenarnya tidak ada gunanya menggunakan getEvent()kecuali jika Anda memerlukan nama acara ATAU ingin kompatibel dengan Magento 1.0
Raphael di Digital Pianism
3

Penjelasan tentang kurangnya konsistensi.

Menurut Vinai dan apa yang dikatakan Vitaly Korotun kepadanya di beberapa titik:

getEvent()adalah warisan. Kembali di Magento, 1,0 hari , data acara tidak dapat ditarik langsung dari pengamat.

Jadi, jika Anda tidak perlu event_namedan tidak terlalu peduli tentang kode Anda yang kompatibel dengan Magento 1.0, Anda dapat meninggalkannya getEvent().

Raphael di Digital Pianism
sumber