Varien_event_observer getName () El método devuelve nulo
-
16-10-2019 - |
Pregunta
No entiendo por qué el objeto Varien_Event_observer tiene Getters y Setters para el atributo 'Nombre'. Sin embargo, cuando lo usa en el método definido por mi XML de configuración, llamar a getName () devuelve nulo?
¿Adivinaría que el nombre de nodo único que usa en la configuración XML debería usarse como el nombre del observador?
p.ej.
<events>
<catalog_product_save_after>
<observers>
<my_special_unique_name>
<type>singleton</type>
<class>my_special/catalog_product_save_after_observer</class>
<method>myMethod</method>
</my_special_unique_name>
</observers>
</catalog_product_save_after>
</events>
public function myMethod($observer) {
//Returns null , not what I would expect to be "my_special_unique_name"
$observer->getName();
}
¿Me estoy perdiendo algo, hubo intención allí y nunca se agregó?
Solución
Obtiene un valor vacío para el nombre del observador porque el nombre no está configurado. No hay ninguna línea como $observer->setName()
La instancia de observador se crea en Mage_Core_Model_App::duspatchEvent()
Y las únicas operaciones realizadas con él son las siguientes:
//instantiate
$observer = new Varien_Event_Observer();
//set event details
$observer->setData(array('event'=>$event));
//call the needed method with the $observer as parameter
$this->_callObserverMethod($object, $method, $observer);
//the line above is just a wrapper for $object->$method($observer);
Si inyectas en algún lugar entre el momento en que se instancia el observador y el momento en que el método se llama:
$observer->setName('Mickey Mouse');
Podrá obtener el nombre del observador en su método.
El valor que esperaba que se devolviera es en realidad el valor de la variable $obsName
En este código:
foreach ($eventConfig->observers->children() as $obsName=>$obsConfig) {
$observers[$obsName] = array(
'type' => (string)$obsConfig->type,
'model' => $obsConfig->class ? (string)$obsConfig->class : $obsConfig->getClassName(),
'method'=> (string)$obsConfig->method,
'args' => (array)$obsConfig->args,
);
}
Esa etiqueta se usa solo para poder tener diferentes observadores para el mismo evento (diferentes valores de etiqueta) o para poder anular a algún observador usando en su propio módulo una de las etiquetas existentes para un evento.