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)

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top