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)


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


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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.