Magento 2: Plugin vs Observer


27

W Magento 2 jakie są zalety i wady używania wtyczki w porównaniu z obserwatorem, aby coś osiągnąć?

Rozumiem, że obserwatorzy subskrybują wydarzenia, podczas gdy wtyczki mogą wskoczyć przed i / lub po wywołaniu metody publicznej na klasie Magento, ale z pewnością zbliżają się teraz bardzo do skrzyżowania ścieżek?


obserwator będzie bardzo ograniczony, ale wtyczka wprowadza zmiany dla wszystkich funkcji publicznych
Pradeep Kumar

Odpowiedzi:


42

Wtyczki są wszechobecne, ponieważ można modyfikować / zastępować zachowanie dowolnej metody publicznej w systemie. Dostosowania powinny być wykonywane przy użyciu wtyczek do publicznych metod / klas oznaczonych @apiadnotacjami (stabilny publiczny interfejs API), gdy tylko jest to możliwe. Takie podejście gwarantuje, że dostosowywanie pozostanie funkcjonalne po nowych wersjach Magento. Oprócz before/ afterwtyczek wymienionych w pytaniu, możliwe jest tworzenie aroundwtyczek w celu zastąpienia oryginalnego zachowania.

Z drugiej strony, obserwatorzy są starszym mechanizmem rozszerzenia odziedziczonym po Magento 1, jest on dość ograniczony i należy go w miarę możliwości unikać. Jednak w przeciwieństwie do wtyczek mogą one zapewniać punkty rozszerzeń w metodach chronionych / prywatnych.


Spójrz także na odpowiedź mówiącą o preferencjach vs wtyczkach / obserwatorach: magento.stackexchange.com/a/94035/697 , mogą być przydatne.
Alex Paliarush,

@alex: - jak napisać wtyczkę dla funkcji chronionej, w większości przypadków musimy zastąpić funkcję chronioną w takiej sytuacji, jak to zrobić? magento.stackexchange.com/questions/91353/…
Pradeep Kumar

Wtyczki @PradeepKumar można dodawać tylko do metod publicznych. Wspomniane pytanie zawiera odpowiedź, ale proponowane rozwiązanie jest zablokowane, ale znany problem (wtyczek nie można zastosować do typów wirtualnych). Jako tymczasowe obejście możesz zadeklarować wtyczkę dla ramowej klasy URL i dodać logikę warunkową na podstawie argumentów (aby wtyczka
działała

i jut podałem jeden przykład, w tym przypadku jest wiele funkcji chronionych, jak przesłonić, w dowolny sposób i przesłonić chronioną funkcję
Pradeep Kumar,

@PradeepKumar, jeśli chcesz zastąpić chronioną metodę, może być konieczne rozszerzenie klasy i użycie preferencji / przepisywania. W każdym razie sugeruj, aby zadać pytanie zamiast w tych komentarzach
Robbie Averill,

1

Zgodnie z przewodnikiem technicznym Magento ( https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events ): NIE MOŻNA podawać wszystkich wartości (w tym obiektów) przekazywanych do zdarzenia zmodyfikowane w obserwatorze zdarzeń. Zamiast tego wtyczki MUSZĄ BYĆ używane do modyfikowania wejścia lub wyjścia funkcji.

Dla mnie główna różnica między wtyczkami a obserwatorami to:

  1. Wtyczki mogą modyfikować tylko metody publiczne, podczas gdy obserwatorzy mogą modyfikować również prywatne, chronione.
  2. Dla wtyczek istnieje kolejność sortowania, ale dla obserwatorów nie ma kolejności sortowania.
  3. Możesz dodać obserwatora tylko do wydarzeń, które zostały już wysłane w Magento. Wtyczki są tutaj bardziej elastyczne.

Mogę również zaktualizować zamówienie u obserwatora, prawda?
Robbie Averill

@RobbieAverill tak, możesz utworzyć obserwatora checkout_submit_all_afterwydarzenia. Twój obserwator zostanie aktywowany po pomyślnym złożeniu zamówienia.
Transversus

Czy to oznacza, że ​​„nie modyfikują danych” w tym przypadku nie są prawdziwe?
Robbie Averill

1
Tak, masz rację @RobbieAverill Zarówno wtyczki, jak i obserwatorzy mogą modyfikować dane. Dla mnie główna różnica między wtyczkami a obserwatorami to: 1. Wtyczki mogą modyfikować tylko metody publiczne, podczas gdy obserwatorzy mogą modyfikować również prywatne, chronione. 2. Istnieje porządek sortowania wtyczek, ale nie ma porządku sortowania dla obserwatorów. 3. Możesz dodać obserwatora tylko do wydarzeń, które zostały już wysłane w Magento. Wtyczki są tutaj bardziej elastyczne.
transversus
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.