Algo que noté recientemente y tengo curiosidad al respecto.
Ejemplo 1: el uso de getEvent()
En Mage_Core_Model_Localeel setLocale()método, se distribuye un evento:
Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));
Un observador para este evento es bindLocale()deMage_Adminhtml_Model_Observer
public function bindLocale($observer)
{
if ($locale=$observer->getEvent()->getLocale()) {
if ($choosedLocale = Mage::getSingleton('adminhtml/session')->getLocale()) {
$locale->setLocaleCode($choosedLocale);
}
}
return $this;
}
Entonces, como puede ver, para recuperar la configuración regional, primero llamamos getEvent()al observador.
Ejemplo 2: sin getEvent()
En Mage_Wishlist_Block_Customer_Wishlist_Item_Optionsel __construct()método, se distribuye un evento:
Mage::dispatchEvent('product_option_renderer_init', array('block' => $this));
Por lo tanto, estamos de acuerdo en que se usa la misma sintaxis para los ejemplos 1 y 2.
Sin embargo, un observador para este segundo ejemplo es initOptionRenderer()deMage_Bundle_Model_Observer
public function initOptionRenderer(Varien_Event_Observer $observer)
{
$block = $observer->getBlock();
$block->addOptionsRenderCfg('bundle', 'bundle/catalog_product_configuration');
return $this;
}
Y como puede ver, para recuperar el bloque, no llamamos getEvent()al observador
Pregunta
- ¿Por qué se
getEvent()llama al método en el ejemplo 1? ¿O por quégetEvent()no se llama en el ejemplo # 2? - ¿Cuál es el propósito del
getEvent()método? - ¿Dónde se debe usar
getEvent()y dónde no se debe usar?
fuente

Una cosa está clara.
Llamar
$observer->getEvent()->getSomething()y$observer->getSomething()devolver lo mismo.Echa un vistazo al
Mage_Core_Model_App::dispatchEventmétodo.En un momento tienes
$event = new Varien_Event($args);dónde$argsestán los argumentos pasados aldispatchEventmétodo.Y se
Varien_EventextiendeVarien_Objectpara que pueda acceder mágicamente a los elementos$argsdesde laVarien_Eventinstancia.pero también existe esta línea
$observer->addData($args);donde$argsestán las mismas cosas que arriba.Varien_Event_Observertambién se extiendeVarien_Objectpara que esto le permita acceder mágicamente a los elementos a$argstravés del objeto Observador.Conclusión:
El
$_datamiembro en la clase Observador y en la clase Evento contiene el mismo tipo de cosas. El observador tiene además algunos otros campos. comoevent,event_name.Digamos que se
$argsve así:Al despachar el evento, el
$_dataobjeto en el evento se vería así:y en la clase Observador se vería así:
Pero no puedo responder por qué existe esta falta de coherencia.
Solo puedo especular que el código fue escrito por 2 desarrolladores diferentes.
Si vale algo, siempre lo uso
$observer->getEvent()->getSomething().[EDITAR]
Falta de coherencia
El
Varien_Eventobjeto debe ser un objeto envoltorio sobre los argumentos pasados al observadorfuente
$observer->getEvent()tomar cualquier dato en observador. Sé que podemos obtener datos$observerdirectamente. Pero no hago eso porque siempre siento que la inyección de objetosVarien_Eventes muy específica para contener datos de eventos. Por lo tanto, siempre dependo del objeto de evento. Siento que ese es el enfoque correcto.getEvent()excepto si necesita el nombre del evento O desea ser compatible con Magento 1.0Explicación sobre la falta de consistencia.
Según Vinai y lo que Vitaly Korotun le dijo en algún momento:
Entonces, si no necesita obtener
event_namey no le importa demasiado que su código sea compatible con Magento 1.0, puede omitirlogetEvent().fuente