Donc, Magento propose 2 façons de déclarer un observateur. Singleton et Model (nouvelle instance) en spécifiant la <type>balise dans Magento 1.x et l' sharedattribut dans Magento 2.
Magento 1 façon de le faire.
<events>
<event_name>
<observers>
<unique_observer_name>
<type>model|object|singleton|null</type>
<class>class/alias_here</class>
<method>methdNameHere</method>
</unique_observer_name>
</observers>
</event_name>
</events>
Version Magento 2:
<event name="event_name">
<observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>
Ainsi, dans le cas de Magento 1, si la <type>balise est un modèle ou un objet, la classe sera instanciée avec Mage::getModel(). Si c'est singletonou il manque, il est instancié en utilisant Mage::getSingleton().
Dans le cas de Magento 2, si sharedest falsealors la classe est instanciée en utilisant $this->_observerFactory->create() (nouvelle instance).
si sharedest vrai, il est instancié en utilisant $this->_observerFactory->get()(singleton).
L'idée d'observateur d'événement est très similaire entre les deux versions, mais la plupart des observateurs de Magento 1 sont utilisés en tant que singletons, car la typebalise est manquante et dans Magento 2, la plupart des observateurs (je pense tous) l'ont fait shared="false".
Je suis perplexe. Quand devrais-je utiliser des singletons et quand devrais-je utiliser de nouvelles instances pour les observateurs?
La version Magento (1 ou 2) n’est pas importante ici.
Un cas d'utilisation simple ferait pour chaque approche (nouvelle instance ou singleton)
typebalise n'est la même chose que <type>singleton</type>. Alors, quelle est la raison pour laquelle nous faisons les observateurs singletons?
typeattribut du tout, je le passe généralement maintenant.