Magento 1: perché un metodo osservatore chiama getEvent () e altri no?


8

Qualcosa che ho notato di recente e ne sono curioso.

Esempio 1: l'uso di getEvent()

Nel Mage_Core_Model_Localenel setLocale()metodo, un evento viene inviato:

Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));

Un osservatore per questo evento viene bindLocale()daMage_Adminhtml_Model_Observer

public function bindLocale($observer)
{
    if ($locale=$observer->getEvent()->getLocale()) {
        if ($choosedLocale = Mage::getSingleton('adminhtml/session')->getLocale()) {
            $locale->setLocaleCode($choosedLocale);
        }
    }
    return $this;
}

Come puoi vedere, per recuperare la localizzazione, chiamiamo prima getEvent()l'osservatore.

Esempio 2: senza getEvent()

Nel Mage_Wishlist_Block_Customer_Wishlist_Item_Optionsnel __construct()metodo, un evento viene inviato:

Mage::dispatchEvent('product_option_renderer_init', array('block' => $this));

Quindi concordiamo che la stessa sintassi viene utilizzata per gli esempi 1 e 2.

Tuttavia, un osservatore per questo secondo esempio viene initOptionRenderer()daMage_Bundle_Model_Observer

public function initOptionRenderer(Varien_Event_Observer $observer)
{
    $block = $observer->getBlock();
    $block->addOptionsRenderCfg('bundle', 'bundle/catalog_product_configuration');
    return $this;
}

E come puoi vedere, per recuperare il blocco, non chiamiamo getEvent()l'osservatore

Domanda

  • Perché il getEvent()metodo è chiamato nell'esempio n. 1? O perché getEvent()non viene chiamato nell'esempio n. 2?
  • Qual è lo scopo del getEvent()metodo?
  • Dove si dovrebbe usare getEvent()e dove non si dovrebbe usare?

Risposte:


7

Probabilmente ha ragioni storiche, che vanno oltre la versione 1.0.

L' Varien_Eventoggetto è il luogo logico in cui contenere i parametri per un evento concreto, ma poiché Magento passa un Varien_Observeroggetto a tutti i metodi di osservazione, l'accesso ai parametri ha senso (ed è presente almeno dalla 1.1).

In realtà non vedo alcun valore in due oggetti diversi come sono usati oggi .

Ma ovviamente non è stato pianificato così dall'inizio. Nel metodo Mage::addObserver(), non <args>sono impostati solo i nomi di eventi e osservatori e argomenti statici dal nodo XML, ma anche un callback:

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

In questo modo, gli osservatori sono in grado di inviare se stessi, con $observer->dispatch($event). In tal caso, gli osservatori non avrebbero i dati dell'evento su se stessi e sarà necessario utilizzarli getEvent()per accedervi. Ma il metodo non viene utilizzato da nessuna parte, quindi in pratica non importa.

Se vuoi praticare un po 'di archeologia del software e scavare di più, troverai più codici morti che suggeriscono idee originali che non sono mai diventate nel prodotto finale, come il Varien_Event_Observer_Collection.


Grazie. Stava per citare aspetti "storici". Sembra che tu l'abbia fatto per noi :)
Rajeev K Tomy,

8

Una cosa è chiara

Chiamare $observer->getEvent()->getSomething()e $observer->getSomething()restituire la stessa cosa.

Dai un'occhiata al Mage_Core_Model_App::dispatchEventmetodo.

Ad un certo punto hai $event = new Varien_Event($args);dove $argssono gli argomenti passati al dispatchEventmetodo.
E Varien_Eventsi estende Varien_Objectin modo da poter accedere magicamente gli elementi in $argsdal Varien_Eventcaso.

ma c'è anche questa linea $observer->addData($args);dove $argssono le stesse cose di cui sopra.

Varien_Event_Observersi estende anche in Varien_Objectmodo da consentire l'accesso magico agli elementi $argstramite l'oggetto Observer.

Conclusione:

Il $_datamembro nella classe Observer e nella classe Event contiene le stesse cose. L'osservatore ha inoltre alcuni altri campi. come event, event_name.

Diciamo che $argsassomiglia a questo:

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

Quando si invia l'evento, l' $_dataoggetto Event dovrebbe apparire così:

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

e nella classe Observer sarebbe simile a questo:

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

Ma non posso rispondere al motivo per cui esiste questa mancanza di coerenza.
Posso solo ipotizzare che il codice sia stato scritto da 2 sviluppatori diversi.
Se vale qualcosa, lo uso sempre $observer->getEvent()->getSomething().

[MODIFICARE]

Perché il metodo getEvent () viene chiamato nell'esempio n. 1? O perché getEvent () non viene chiamato nell'esempio n. 2?

Mancanza di coerenza

Qual è lo scopo del metodo getEvent ()?

L' Varien_Eventoggetto dovrebbe essere un oggetto wrapper sugli argomenti passati all'osservatore

Dove si dovrebbe usare getEvent () e dove non si dovrebbe usare? Usali come preferisci. Otterrai sempre lo stesso risultato.


Ho la spiegazione della mancanza di coerenza, vedi la mia risposta
Raffaello al Pianismo digitale,

Perferisco sempre $observer->getEvent()a prendere qualsiasi dato nell'osservatore. So che possiamo raccogliere dati $observerdirettamente. Ma non lo faccio perché sento sempre che l'iniezione di oggetti Varien_Eventè molto specifica per contenere i dati degli eventi. Quindi dipendo sempre dall'oggetto evento. Sento che è l'approccio corretto.
Rajeev K Tomy,

@RajeevKTomy vedi la mia risposta, in realtà non ha senso utilizzare getEvent()tranne se hai bisogno del nome dell'evento O vuoi essere compatibile con Magento 1.0
Raphael at Digital Pianism,

3

Spiegazione relativa alla mancanza di coerenza.

Secondo Vinai e ciò che Vitaly Korotun gli ha detto ad un certo punto:

getEvent()è eredità. Torna in Magento 1.0 giorni i dati degli eventi non potevano essere tirato dall'osservatore direttamente.

Quindi, se non hai bisogno di ottenere event_namee non ti interessa troppo che il tuo codice sia compatibile con Magento 1.0, puoi lasciarlo fuori getEvent().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.