Magento 1: Warum rufen einige Beobachtermethoden getEvent () auf und andere nicht?


8

Etwas, das mir kürzlich aufgefallen ist und auf das ich neugierig bin.

Beispiel 1: die Verwendung von getEvent()

In Mage_Core_Model_Localeder 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_Optionsder __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 wird getEvent()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?

Antworten:


7

Es hat wahrscheinlich historische Gründe, die über die Version 1.0 hinausreichen.

Das Varien_EventObjekt ist der logische Ort, an dem Parameter für ein konkretes Ereignis enthalten sind. Da Magento jedoch ein Varien_ObserverObjekt an alle Beobachtermethoden übergibt, ist ein Verknüpfungszugriff auf die Parameter sinnvoll (und es ist mindestens seit 1.1 vorhanden).

Ich sehe eigentlich keinen Wert in zwei verschiedenen Objekten, wie sie heute verwendet werden .

Aber es war offensichtlich nicht von Anfang an so geplant. In der Methode Mage::addObserver()werden nicht nur die Ereignis- und Beobachternamen und statischen Argumente vom <args>XML-Knoten festgelegt, sondern auch ein Rückruf:

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

Auf diese Weise können sich die Beobachter mit versenden $observer->dispatch($event). In diesem Fall hätten die Beobachter die Ereignisdaten nicht für sich und Sie müssten sie verwenden, getEvent()um darauf zuzugreifen. Die Methode wird jedoch nirgendwo angewendet, sodass sie in der Praxis keine Rolle spielt.

Wenn Sie etwas Software-Archäologie üben und mehr graben möchten, finden Sie mehr toten Code, der auf originelle Ideen hinweist, die es nie in das Endprodukt geschafft haben, wie das Varien_Event_Observer_Collection.


Vielen Dank. Wollte über "historische" Aspekte erwähnen. Scheint, als hättest du das für uns getan :)
Rajeev K Tomy

8

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::dispatchEventMethode an.

An einem Punkt haben Sie, $event = new Varien_Event($args);wo $argsdie Argumente an die dispatchEventMethode übergeben werden.
Und Varien_Eventerweitert, Varien_Objectsodass Sie $argsvon der Varien_EventInstanz aus auf magische Weise auf die Elemente zugreifen können .

aber es gibt auch diese Zeile, $observer->addData($args);in der $argsdie gleichen Dinge wie oben sind.

Varien_Event_Observerwird auch erweitert, Varien_Objectsodass Sie $argsüber das Observer-Objekt auf magische Weise auf Elemente zugreifen können.

Fazit:

Das $_dataMitglied in der Observer-Klasse und der Event-Klasse enthält die gleichen Dinge. Der Beobachter hat zusätzlich einige andere Felder. wie event, event_name.

Sagen wir, das $argssieht so aus:

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

Beim Auslösen des Ereignisses $_datasieht das Objekt im Ereignis folgendermaßen aus:

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

und in der Observer-Klasse würde das so aussehen:

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

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]

Warum wird die Methode getEvent () in Beispiel 1 aufgerufen? Oder warum wird getEvent () in Beispiel 2 nicht aufgerufen?

Mangel an Konsistenz

Was ist der Zweck der Methode getEvent ()?

Das Varien_EventObjekt sollte ein Wrapper-Objekt über den an den Beobachter übergebenen Argumenten sein

Wo sollte man getEvent () verwenden und wo sollte man es nicht verwenden? Verwenden Sie sie, wie Sie möchten. Sie erhalten immer das gleiche Ergebnis.


Ich habe die Erklärung bezüglich mangelnder Konsistenz erhalten, siehe meine Antwort
Raphael bei Digital Pianism

Ich ziehe $observer->getEvent()es immer vor , Daten im Beobachter zu erfassen. Ich weiß, dass wir Daten $observerdirekt abrufen können . Aber ich mache das nicht, weil ich immer das Gefühl habe, dass die Injektion von Objekten Varien_Eventsehr spezifisch ist, um Ereignisdaten zu speichern. Daher bin ich immer auf ein Ereignisobjekt angewiesen. Ich denke, das ist der richtige Ansatz.
Rajeev K Tomy

@ RajeevKTomy siehe meine Antwort, es gibt eigentlich keinen Grund zu verwenden, getEvent()außer wenn Sie den Ereignisnamen benötigen oder Magento 1.0-kompatibel sein möchten
Raphael bei Digital Pianism

3

Erklärung zu mangelnder Konsistenz.

Laut Vinai und dem, was Vitaly Korotun ihm irgendwann sagte:

getEvent()ist Vermächtnis. Zurück in Magento 1.0 Tagen konnten die Ereignisdaten nicht direkt vom Beobachter abgerufen werden.

Wenn Sie sich event_namealso nicht darum kümmern müssen, dass Ihr Code Magento 1.0-kompatibel ist, können Sie ihn weglassen getEvent().

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.