Magento Event Observers: Singleton vs. Model

45

Tak więc Magento oferuje 2 sposoby zadeklarowania obserwatora. Singleton i Model (nowa instancja), określając <type>znacznik w Magento 1.x i określając sharedatrybut w Magento 2.

Magento 1 sposób na zrobienie tego.

<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>

Wersja Magento 2:

<event name="event_name">
    <observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>

Tak więc w przypadku Magento 1, jeśli <type>znacznik jest modelem lub obiektem, klasa zostanie utworzona za pomocą instancji Mage::getModel(). Jeśli go singletonbrakuje lub jest brakowany, jest tworzony za pomocą instancji Mage::getSingleton().

W przypadku Magento 2, jeśli sharedtak, falseto instancja klasy jest tworzona przy użyciu $this->_observerFactory->create() (nowej instancji).
jeśli sharedjest prawdą, tworzona jest instancja za pomocą $this->_observerFactory->get()(singleton).

Pomiędzy dwiema wersjami idea obserwatora zdarzeń jest bardzo podobna, ale większość obserwatorów w Magento 1 jest wykorzystywana jako singletony, ponieważ typebrakuje znacznika, aw Magento 2 większość (myślę, że wszyscy) mają shared="false".

Jestem zdziwiony. Kiedy powinienem używać singletonów i kiedy powinienem używać nowych instancji dla obserwatorów?
Wersja Magento (1 lub 2) nie jest tutaj ważna.
Dla każdego podejścia wystarczyłby prosty przypadek użycia (nowa instancja lub singleton)

Marius
źródło
Walczę też z tym. Chociaż nie jest wcale konieczne używanie tego typeatrybutu, dlatego zwykle teraz go pomijam.
Simon
@ Simon Zwykle to pomijam. Żaden typetag nie jest tym samym, co <type>singleton</type>. Jaki jest zatem powód, dla którego obserwatorzy stają się singletonami?
Marius
To jest naprawdę dobre pytanie. Właśnie dlatego głosowałem za tym. Chciałem tylko zaznaczyć, że można go całkowicie pominąć.
Simon

Odpowiedzi:

36

Jest tylko jeden przypadek użycia, w którym singleton dla obserwatorów miałby sens. Tak jest, gdy obserwujesz dwa zdarzenia, które są od siebie zależne i chcesz zdobyć coś podczas pierwszego, ale przetworzyć to podczas drugiego zdarzenia. Możesz również użyć rejestru tutaj, ale byłoby to coś jeszcze bardziej globalnego, więc singleton i chroniona zmienna klasowa są dobrym rozwiązaniem.

W rzeczywistości prawie nigdy tak się nie dzieje, ale magento 1 i 2 domyślnie używają share = true

Prawdopodobny powód, dla którego singleton jest domyślny w Magento: mikrooptymalizacja! Ktoś pomyślał, że zaoszczędziłoby to tak dużo czasu, że nie trzeba tworzyć obiektów raz po raz. Może być prawdą w przypadku niektórych zdarzeń, które są wywoływane kilkaset razy podczas żądania, może być nawet uzasadnione, aby zrobić to domyślnie w przypadku złego użycia zdarzeń.

Flyingmana
źródło
5
Wygląda na wystarczająco dobre wytłumaczenie. . A teraz, kiedy o tym wspomniałeś, uderzyło mnie to w głowę ... prawdziwy przypadek użycia singletonów: kiedy chcesz obserwować, _save_beforea _save_afterdziałania po zapisaniu zależą od czegoś _save_before. Hه! jak mogłem to przegapić?
Marius
”, co oznacza, dlaczego magento2 używa domyślnie shared = false” To źle. Magento 2 używa shared=truedomyślnie .
Mage2.PRO,
dzięki, zaktualizowałem odpowiedź
Flyingmana
1

Magento domyślnie używa singletonu, dzięki czemu oszczędza zasoby w pudełku. model dwóch równoległych potrzeb operacyjnych procesu, ponieważ muszą one przechowywać i przechowywać dane indywidualnie. w singletonie obiekt staje się niestabilny, gdy tylko zostaną załadowane nowe dane.

Z góry magento 2.0 wykorzystuje współdzielone obiekty do wykorzystania .. magento 2.0 ma bardzo dobrze napisane niszczyciele, które utrzymują czyszczenie pamięci, jak tylko zadanie zostanie wykonane!

Vipul Dadhich -TyLabs
źródło