Question

Magento propose donc 2 manières de déclarer un observateur.Singleton et Model (nouvelle instance) en spécifiant le <type> tag dans Magento 1.x et en spécifiant le shared attribut 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 le <type> la balise est un modèle ou un objet, la classe sera instanciée avec Mage::getModel().Si c'est singleton ou il manque, il est instancié en utilisant Mage::getSingleton().

Dans le cas de Magento 2, si shared est false alors la classe est instanciée en utilisant $this->_observerFactory->create() (nouvelle instance).
si shared est vrai, il est instancié en utilisant $this->_observerFactory->get() (singleton).

Entre les deux versions, l'idée de l'observateur d'événements est très similaire, mais la plupart des observateurs dans Magento 1 sont utilisés comme singletons, car le type la balise est manquante et dans Magento 2, la plupart (je pense que tous) des observateurs ont shared="false".

Je suis perplexe. Quand dois-je utiliser des singletons et quand dois-je utiliser de nouvelles instances pour les observateurs ?
La version de Magento (1 ou 2) n'est pas importante ici.
Un cas d'utilisation simple ferait l'affaire pour chaque approche (nouvelle instance ou singleton)

Était-ce utile?

La solution

Il n'y a qu'un seul cas d'utilisation dans lequel un singleton pour les observateurs aurait du sens.C'est à ce moment-là que vous observez deux événements qui dépendent l'un de l'autre et que vous souhaitez obtenir quelque chose lors du premier, mais le traiter lors du deuxième événement.Vous pouvez également utiliser le registre ici, mais ce serait quelque chose d'encore plus global, donc un singleton et une variable de classe protégée sont une bonne solution.

En réalité, cela n'arrive presque jamais, mais magento 1 et 2 utilisent par défaut shared=true

La raison probablement pour laquelle singleton est par défaut dans magento :micro-optimisation !Quelqu'un a pensé que cela permettrait de gagner beaucoup de temps en n'ayant pas besoin de créer les objets encore et encore.Cela peut être vrai pour certains événements qui sont appelés plusieurs centaines de fois au cours d'une requête, peut-être est-il même raisonnable de le faire par défaut pour les cas de mauvaise utilisation des événements.

Autres conseils

Magento utilise par défaut le singleton afin d'économiser les ressources à l'intérieur de la boîte.deux modèles de besoins opérationnels de processus simultanés, car ils doivent stocker et conserver les données individuellement.en singleton, l'objet devient volatile dès que de nouvelles données ont été chargées.

Dès le départ, magento 2.0 utilise des objets partagés pour utiliser...magento 2.0 a des destructeurs très bien écrits qui nettoient la mémoire dès que le travail est terminé !

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top