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 shared
atrybut 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 singleton
brakuje lub jest brakowany, jest tworzony za pomocą instancji Mage::getSingleton()
.
W przypadku Magento 2, jeśli shared
tak, false
to instancja klasy jest tworzona przy użyciu $this->_observerFactory->create()
(nowej instancji).
jeśli shared
jest 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ż type
brakuje 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)
type
atrybutu, dlatego zwykle teraz go pomijam.type
tag nie jest tym samym, co<type>singleton</type>
. Jaki jest zatem powód, dla którego obserwatorzy stają się singletonami?Odpowiedzi:
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ń.
źródło
_save_before
a_save_after
działania po zapisaniu zależą od czegoś_save_before
. Hه! jak mogłem to przegapić?shared=true
domyślnie .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!
źródło