Daher bietet Magento zwei Möglichkeiten, einen Beobachter zu deklarieren. Singleton und Model (neue Instanz) durch Angabe des <type>
Tags in Magento 1.x und durch Angabe des shared
Attributs in Magento 2.
Magento 1 Art und Weise, 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>
Wenn es sich bei dem <type>
Tag in Magento 1 um ein Modell oder Objekt handelt, wird die Klasse mit instanziiert Mage::getModel()
. Wenn es singleton
fehlt oder ist, wird es mit instanziiert Mage::getSingleton()
.
Im Fall von Magento 2, wenn shared
ist, false
wird die Klasse mit instanziiert $this->_observerFactory->create()
(neue Instanz).
Wenn dies shared
zutrifft, wird es mit $this->_observerFactory->get()
(Singleton) instanziiert .
Zwischen den beiden Versionen ist die Idee der Ereignisbeobachter sehr ähnlich, aber die meisten Beobachter in Magento 1 werden als Singletons verwendet, da das type
Tag fehlt und in Magento 2 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?
Magento-Version (1 oder 2) ist hier nicht wichtig.
Ein einfacher Anwendungsfall würde für jeden Ansatz (neue Instanz oder Singleton) ausreichen.
type
Attribut überhaupt zu verwenden, überspringe ich es jetzt normalerweise.type
Tag ist dasselbe wie<type>singleton</type>
. Was ist der Grund, warum wir Beobachter zu Singletons machen?Antworten:
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 möchten etwas während des ersten erhalten, aber es während des zweiten Ereignisses verarbeiten. Sie könnten hier auch die Registrierung verwenden, aber das wäre noch globaler. Daher sind Singleton und eine geschützte Klassenvariable eine gute Lösung.
In Wirklichkeit passiert dies so gut wie nie, aber Magento 1 und 2 verwenden standardmäßig shared = true
Der wahrscheinlich Grund, warum Singleton in Magento Standard ist: Mikrooptimierung! Jemand dachte, es würde so viel Zeit sparen, wenn die Objekte nicht immer wieder erstellt werden müssten. Dies kann für einige Ereignisse zutreffen, die während einer Anforderung einige hundert Mal aufgerufen werden. Es kann sogar sinnvoll sein, dies als Standard für Fälle zu tun, in denen Ereignisse nicht ordnungsgemäß verwendet werden.
quelle
_save_before
und_save_after
und die Aktionen auf Speicher hängen nach etwas aus_save_before
. Duh! wie könnte ich es verpasst haben?shared=true
standardmäßig .Magento verwendet standardmäßig den Singleton, um Ressourcen in der Box zu sparen. Modell mit zwei gleichzeitigen Prozessbetriebsanforderungen, da sie Daten einzeln speichern und halten müssen. In Singleton wird das Objekt flüchtig, sobald neue Daten geladen wurden.
Magento 2.0 nutzt Shared Objects zur Nutzung. Magento 2.0 verfügt über sehr gut geschriebene Destruktoren, die den Speicher bereinigen, sobald die Arbeit erledigt ist!
quelle