Magento Eventbeobachter:Singleton versus Modell
-
12-12-2019 - |
Frage
Magento bietet also 2 Möglichkeiten, einen Beobachter zu deklarieren.Singleton und Model (neue Instanz) durch Angabe der <type>
markieren Sie in Magento 1.x und durch Angabe der shared
attribut in Magento 2.
Magento 1 Weg, es zu tun.
<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>
Magento 2-Version:
<event name="event_name">
<observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>
Also im Fall von Magento 1, wenn die <type>
tag ist Modell oder Objekt, die Klasse wird instanziiert mit Mage::getModel()
.Wenn es ist singleton
oder es fehlt, es wird instanziiert mit Mage::getSingleton()
.
Im Fall von Magento 2, wenn shared
is false
dann wird die Klasse instanziiert mit $this->_observerFactory->create()
(neue Instanz).
wenn shared
ist wahr, es wird instanziiert mit $this->_observerFactory->get()
(Singleton).
Zwischen den beiden Versionen ist die Idee des Ereignisbeobachters sehr ähnlich, aber die meisten Beobachter in Magento 1 werden als Singletons verwendet, weil die type
tag fehlt und in Magento 2 haben die meisten (ich denke alle) Beobachter shared="false"
.
Ich bin verwirrt. Wann sollte ich Singletons verwenden und wann sollte ich neue Instanzen für Beobachter verwenden?
Die Magento-Version (1 oder 2) ist hier nicht wichtig.
Ein einfacher Anwendungsfall würde für jeden Ansatz ausreichen (neue Instanz oder Singleton)
Lösung
Es gibt nur einen Anwendungsfall, in dem Singleton für Beobachter sinnvoll wäre.Das ist, wenn Sie zwei Ereignisse beobachten, die voneinander abhängen und Sie während des ersten etwas bekommen möchten, es aber während des zweiten Ereignisses verarbeiten.Sie könnten hier auch die Registrierung verwenden, aber das wäre etwas noch Globaleres, daher sind Singleton und eine geschützte Klassenvariable eine gute Lösung.
In Wirklichkeit passiert dies fast nie, aber Magento 1 und 2 verwenden standardmäßig shared= true
Der wahrscheinliche Grund, warum Singleton in Magento Standard ist:mikro-Optimierung!Jemand dachte, es würde sooo viel Zeit sparen, die Objekte nicht immer wieder erstellen zu müssen.Kann für einige Ereignisse zutreffen, die während einer Anfrage einige hundert Mal aufgerufen werden, kann es sogar sinnvoll sein, dies als Standard für die Fälle einer schlechten Verwendung von Ereignissen zu tun.
Andere Tipps
Magento verwendet standardmäßig den Singleton, um Ressourcen in der Box zu sparen.zwei gleichzeitige Prozessbetriebsanforderungen modellieren, da sie Daten einzeln speichern und speichern müssen.in Singleton wird das Objekt flüchtig, sobald neue Daten geladen wurden.
Magento 2.0 verwendet derzeit gemeinsam genutzte Objekte..magento 2.0 hat sehr gut geschriebene Destruktoren, die den Speicher bereinigen, sobald die Arbeit erledigt ist!