Magento 1: pourquoi certaines méthodes d'observation appellent getEvent () et d'autres non?


8

Quelque chose que j'ai remarqué récemment et qui m'intéresse.

Exemple 1: l'utilisation de getEvent()

Dans Mage_Core_Model_Localela 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_Optionsla __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-il getEvent()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?

Réponses:


7

Il a probablement des raisons historiques, allant au-delà de la version 1.0.

L' Varien_Eventobjet est l'endroit logique pour contenir les paramètres d'un événement concret, mais puisque Magento passe unVarien_Observer objet à toutes les méthodes d'observation, un raccourci permet d'accéder aux paramètres (et il existe depuis au moins depuis la version 1.1).

En fait, je ne vois aucune valeur dans deux objets différents car ils sont utilisés aujourd'hui .

Mais ce n'était évidemment pas prévu comme ça depuis le début. Dans la méthode Mage::addObserver(), non seulement les noms d'événement et d'observateur et les arguments statiques du <args>nœud XML sont définis, mais également un rappel:

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

De cette façon, les observateurs peuvent se dépêcher, avec $observer->dispatch($event). Dans ce cas, les observateurs n'auraient pas les données de l'événement sur eux-mêmes et vous auriez besoin de vous getEvent()pour y accéder. Mais la méthode n'est utilisée nulle part, donc dans la pratique, cela n'a pas d'importance.

Si vous voulez pratiquer l'archéologie logicielle et creuser plus, vous trouverez plus de code mort qui fait allusion à des idées originales qui n'ont jamais fait partie du produit final, comme le Varien_Event_Observer_Collection.


Je vous remercie. Allait mentionner les aspects "historiques". On dirait que tu as fait ça pour nous :)
Rajeev K Tomy

8

Une chose est claire.

Appeler $observer->getEvent()->getSomething()et $observer->getSomething()retourner la même chose.

Jetez un oeil à la Mage_Core_Model_App::dispatchEventméthode.

À un moment donné, vous avez $event = new Varien_Event($args);$argssont les arguments passés à la dispatchEventméthode.
Et Varien_Events'étend Varien_Objectpour que vous puissiez accéder comme par magie aux éléments $argsdepuis l' Varien_Eventinstance.

mais il y a aussi cette ligne $observer->addData($args);$argssont les mêmes choses que ci-dessus.

Varien_Event_Observers'étend également Varien_Object, ce qui vous permet d'accéder comme par magie aux éléments $argsvia l'objet Observer.

Conclusion:

Les $_datamembres 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. comme event, event_name.

Disons le $argslook comme ceci:

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

Lors de la répartition de l'événement, l' $_dataobjet dans l'événement ressemblerait à ceci:

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

et dans la classe Observer ressemble à ceci:

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

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]

Pourquoi la méthode getEvent () est-elle appelée dans l'exemple # 1? Ou pourquoi getEvent () n'est-il pas appelé dans l'exemple # 2?

Manque de cohérence

Quel est le but de la méthode getEvent ()?

L' Varien_Eventobjet doit être un objet wrapper sur les arguments passés à l'observateur

Où doit-on utiliser getEvent () et où ne doit-on pas l'utiliser? Utilisez-les comme vous le souhaitez. Vous obtiendrez toujours le même résultat.


Vous avez l'explication concernant le manque de cohérence, voir ma réponse
Raphael au Digital Pianism

Je préfère toujours $observer->getEvent()saisir toutes les données en observateur. Je sais que nous pouvons récupérer des données $observerdirectement. Mais je ne le fais pas parce que j'ai toujours l'impression que l'injection d'objet Varien_Eventest 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.
Rajeev K Tomy

@RajeevKTomy voir ma réponse, il n'y a en fait aucun intérêt à l'utiliser, getEvent()sauf si vous avez besoin du nom de l'événement OU voulez être compatible avec Magento 1.0
Raphael at Digital Pianism

3

Explication concernant le manque de cohérence.

Selon Vinai et ce que Vitaly Korotun lui a dit à un moment donné:

getEvent()est un héritage. De retour dans Magento 1.0 jours, les données de l'événement n'ont pas pu être extraites directement de l'observateur.

Donc, si vous n'avez pas besoin d'obtenir event_nameet que vous ne vous souciez pas trop de la compatibilité de votre code avec Magento 1.0, vous pouvez laisser de côté getEvent().

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.