Algo que noté recientemente y tengo curiosidad al respecto.
Ejemplo 1: el uso de getEvent()
En Mage_Core_Model_Locale
el 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_Options
el __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::dispatchEvent
método.En un momento tienes
$event = new Varien_Event($args);
dónde$args
están los argumentos pasados aldispatchEvent
método.Y se
Varien_Event
extiendeVarien_Object
para que pueda acceder mágicamente a los elementos$args
desde laVarien_Event
instancia.pero también existe esta línea
$observer->addData($args);
donde$args
están las mismas cosas que arriba.Varien_Event_Observer
también se extiendeVarien_Object
para que esto le permita acceder mágicamente a los elementos a$args
través del objeto Observador.Conclusión:
El
$_data
miembro 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
$args
ve así:Al despachar el evento, el
$_data
objeto 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_Event
objeto debe ser un objeto envoltorio sobre los argumentos pasados al observadorfuente
$observer->getEvent()
tomar cualquier dato en observador. Sé que podemos obtener datos$observer
directamente. Pero no hago eso porque siempre siento que la inyección de objetosVarien_Event
es 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_name
y no le importa demasiado que su código sea compatible con Magento 1.0, puede omitirlogetEvent()
.fuente