Etwas, das mir kürzlich aufgefallen ist und auf das ich neugierig bin.
Beispiel 1: die Verwendung von getEvent()
In Mage_Core_Model_Locale
der setLocale()
Methode wird ein Ereignis ausgelöst:
Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));
Ein Beobachter für dieses Ereignis ist bindLocale()
vonMage_Adminhtml_Model_Observer
public function bindLocale($observer)
{
if ($locale=$observer->getEvent()->getLocale()) {
if ($choosedLocale = Mage::getSingleton('adminhtml/session')->getLocale()) {
$locale->setLocaleCode($choosedLocale);
}
}
return $this;
}
Wie Sie sehen können, rufen wir zuerst getEvent()
den Beobachter auf, um das Gebietsschema abzurufen .
Beispiel 2: ohne getEvent()
In Mage_Wishlist_Block_Customer_Wishlist_Item_Options
der __construct()
Methode wird ein Ereignis ausgelöst:
Mage::dispatchEvent('product_option_renderer_init', array('block' => $this));
Wir sind uns also einig, dass zum Beispiel 1 und 2 dieselbe Syntax verwendet wird.
Ein Beobachter für dieses zweite Beispiel stammt jedoch initOptionRenderer()
ausMage_Bundle_Model_Observer
public function initOptionRenderer(Varien_Event_Observer $observer)
{
$block = $observer->getBlock();
$block->addOptionsRenderCfg('bundle', 'bundle/catalog_product_configuration');
return $this;
}
Und wie Sie sehen, rufen wir den Beobachter nicht an , um den Block abzurufengetEvent()
Frage
- Warum wird die
getEvent()
Methode in Beispiel 1 aufgerufen? Oder warum wirdgetEvent()
in Beispiel 2 nicht aufgerufen? - Was ist der Zweck der
getEvent()
Methode? - Wo soll man es verwenden
getEvent()
und wo sollte man es nicht verwenden?
quelle
Eines ist klar.
Rufen Sie an
$observer->getEvent()->getSomething()
und$observer->getSomething()
geben Sie dasselbe zurück.Schauen Sie sich die
Mage_Core_Model_App::dispatchEvent
Methode an.An einem Punkt haben Sie,
$event = new Varien_Event($args);
wo$args
die Argumente an diedispatchEvent
Methode übergeben werden.Und
Varien_Event
erweitert,Varien_Object
sodass Sie$args
von derVarien_Event
Instanz aus auf magische Weise auf die Elemente zugreifen können .aber es gibt auch diese Zeile,
$observer->addData($args);
in der$args
die gleichen Dinge wie oben sind.Varien_Event_Observer
wird auch erweitert,Varien_Object
sodass Sie$args
über das Observer-Objekt auf magische Weise auf Elemente zugreifen können.Fazit:
Das
$_data
Mitglied in der Observer-Klasse und der Event-Klasse enthält die gleichen Dinge. Der Beobachter hat zusätzlich einige andere Felder. wieevent
,event_name
.Sagen wir, das
$args
sieht so aus:Beim Auslösen des Ereignisses
$_data
sieht das Objekt im Ereignis folgendermaßen aus:und in der Observer-Klasse würde das so aussehen:
Aber ich kann nicht antworten, warum dieser Mangel an Konsistenz besteht.
Ich kann nur spekulieren, dass der Code von 2 verschiedenen Entwicklern geschrieben wurde.
Wenn es etwas wert ist, benutze ich immer
$observer->getEvent()->getSomething()
.[BEARBEITEN]
Mangel an Konsistenz
Das
Varien_Event
Objekt sollte ein Wrapper-Objekt über den an den Beobachter übergebenen Argumenten seinquelle
$observer->getEvent()
es immer vor , Daten im Beobachter zu erfassen. Ich weiß, dass wir Daten$observer
direkt abrufen können . Aber ich mache das nicht, weil ich immer das Gefühl habe, dass die Injektion von ObjektenVarien_Event
sehr spezifisch ist, um Ereignisdaten zu speichern. Daher bin ich immer auf ein Ereignisobjekt angewiesen. Ich denke, das ist der richtige Ansatz.getEvent()
außer wenn Sie den Ereignisnamen benötigen oder Magento 1.0-kompatibel sein möchtenErklärung zu mangelnder Konsistenz.
Laut Vinai und dem, was Vitaly Korotun ihm irgendwann sagte:
Wenn Sie sich
event_name
also nicht darum kümmern müssen, dass Ihr Code Magento 1.0-kompatibel ist, können Sie ihn weglassengetEvent()
.quelle