Magento Event Observers: Singleton versus Model


45

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 sharedAttributs 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 singletonfehlt oder ist, wird es mit instanziiert Mage::getSingleton().

Im Fall von Magento 2, wenn sharedist, falsewird die Klasse mit instanziiert $this->_observerFactory->create() (neue Instanz).
Wenn dies sharedzutrifft, 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 typeTag 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.


Auch damit zu kämpfen. Obwohl es nicht notwendig ist, das typeAttribut überhaupt zu verwenden, überspringe ich es jetzt normalerweise.
Simon

@ Simon Ich überspringe es normalerweise. Kein typeTag ist dasselbe wie <type>singleton</type>. Was ist der Grund, warum wir Beobachter zu Singletons machen?
Marius

Das ist in der Tat eine gute Frage. Deshalb habe ich es hochgestuft. Ich wollte nur darauf hinweisen, dass Sie es auch ganz überspringen können.
Simon

Antworten:


36

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.


5
Nähte mögen eine gute Erklärung. . Und jetzt, wo du es erwähnt wird , traf es mich in dem Kopf ... einen echten Anwendungsfall für Singletons: Wenn Sie beobachten wollen _save_beforeund _save_afterund die Aktionen auf Speicher hängen nach etwas aus _save_before. Duh! wie könnte ich es verpasst haben?
Marius

"weshalb magento2 standardmäßig shared = false verwendet" Dies ist falsch. Magento 2 Anwendungen shared=truestandardmäßig .
Mage2.PRO


thx, hat die Antwort aktualisiert
Flyingmana

1

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.