Quelque chose que j'ai remarqué récemment et qui m'intéresse.
Exemple 1: l'utilisation de getEvent()
Dans Mage_Core_Model_Locale
la setLocale()
méthode, un événement est distribué:
Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));
Un observateur de cet événement est 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;
}
Comme vous pouvez le voir, pour récupérer les paramètres régionaux, nous faisons d'abord appel getEvent()
à l'observateur.
Exemple 2: sans getEvent()
Dans Mage_Wishlist_Block_Customer_Wishlist_Item_Options
la __construct()
méthode, un événement est distribué:
Mage::dispatchEvent('product_option_renderer_init', array('block' => $this));
Nous convenons donc que la même syntaxe est utilisée pour les exemples 1 et 2.
Cependant, un observateur de ce deuxième exemple vient initOptionRenderer()
deMage_Bundle_Model_Observer
public function initOptionRenderer(Varien_Event_Observer $observer)
{
$block = $observer->getBlock();
$block->addOptionsRenderCfg('bundle', 'bundle/catalog_product_configuration');
return $this;
}
Et comme vous pouvez le voir, pour récupérer le bloc, nous ne faisons pas appel getEvent()
à l'observateur
Question
- Pourquoi la
getEvent()
méthode est-elle appelée dans l'exemple # 1? Ou pourquoi n'est-ilgetEvent()
pas appelé dans l'exemple # 2? - Quel est le but de la
getEvent()
méthode? - Où doit-on l'utiliser
getEvent()
et où ne doit-on pas l'utiliser?
la source
Une chose est claire.
Appeler
$observer->getEvent()->getSomething()
et$observer->getSomething()
retourner la même chose.Jetez un oeil à la
Mage_Core_Model_App::dispatchEvent
méthode.À un moment donné, vous avez
$event = new Varien_Event($args);
où$args
sont les arguments passés à ladispatchEvent
méthode.Et
Varien_Event
s'étendVarien_Object
pour que vous puissiez accéder comme par magie aux éléments$args
depuis l'Varien_Event
instance.mais il y a aussi cette ligne
$observer->addData($args);
où$args
sont les mêmes choses que ci-dessus.Varien_Event_Observer
s'étend égalementVarien_Object
, ce qui vous permet d'accéder comme par magie aux éléments$args
via l'objet Observer.Conclusion:
Les
$_data
membres de la classe Observer et de la classe Event contiennent un peu les mêmes choses. L'observateur possède en outre quelques autres domaines. commeevent
,event_name
.Disons le
$args
look comme ceci:Lors de la répartition de l'événement, l'
$_data
objet dans l'événement ressemblerait à ceci:et dans la classe Observer ressemble à ceci:
Mais je ne peux pas expliquer pourquoi ce manque de cohérence existe.
Je ne peux que spéculer que le code a été écrit par 2 développeurs différents.
Si ça vaut quelque chose, je l'utilise toujours
$observer->getEvent()->getSomething()
.[ÉDITER]
Manque de cohérence
L'
Varien_Event
objet doit être un objet wrapper sur les arguments passés à l'observateurla source
$observer->getEvent()
saisir toutes les données en observateur. Je sais que nous pouvons récupérer des données$observer
directement. Mais je ne le fais pas parce que j'ai toujours l'impression que l'injection d'objetVarien_Event
est très spécifique pour contenir des données d'événement. Par conséquent, je dépend toujours de l'objet d'événement. Je pense que c'est la bonne approche.getEvent()
sauf si vous avez besoin du nom de l'événement OU voulez être compatible avec Magento 1.0Explication concernant le manque de cohérence.
Selon Vinai et ce que Vitaly Korotun lui a dit à un moment donné:
Donc, si vous n'avez pas besoin d'obtenir
event_name
et que vous ne vous souciez pas trop de la compatibilité de votre code avec Magento 1.0, vous pouvez laisser de côtégetEvent()
.la source