Przepisywanie klas Magento 2 vs Wtyczki


17

Magento 2 ma koncepcję Wtyczki / Przechwytywanie / Przechwytywanie w przeciwieństwie do Magento 1.
Działają one jak przed | po wydarzeniu dla każdej publicznej metody. Co jest miłe.
Możesz również użyć aroundwtyczki, aby zastąpić funkcjonalność metody.
Ale Magento 2 nadal oferuje możliwość przepisywania klas mniej więcej w sposób M1.
Chciałbym zobaczyć kilka przykładów, w których zamiast pisać wtyczki należy przejść do przepisywania klas.
Wiem, że jest to przydatne, gdy chcesz zmienić zachowanie podstawowej metody chronionej, ale czy istnieją inne przypadki, w których przepisanie jest zalecane lub potrzebne?


Odpowiedzi:


19

Oczywistym powodem użycia przepisywania zamiast wtyczki jest to, że musisz zastąpić prywatne, chronione lub końcowe metody .

Ale rozważ także następujące scenariusze.

Pierwszy scenariusz (bezwzględna kolejność sortowania):

Przepisywanie może być przydatne, gdy chcesz uruchomić kod przed wtyczkami . Wiem, że możesz to zrobić, ustawiając wtyczkę sortOrder, ale nie możesz być pewien, że Twój kod zawsze będzie pierwszy, gdy ktoś (nie ty) zamierza zainstalować komponenty innych firm.

Drugi scenariusz (wyklucz kod):

Jeśli chcesz wykluczyć lub przepisać tylko fragment kodu w metodzie, wtyczka może być nieoptymalnym sposobem. Wiem, że możesz użyć aroundwtyczki i uniknąć wywoływania proceed, ale może to uszkodzić inne wtyczki na stosie.

Scenariusz trzeci (styl kodu):

Powinieneś używać przepisywania, gdy musisz przepisać zachowanie, wtyczki powinny być używane do modyfikowania danych wyjściowych lub uruchamiania kodu przed / po.

Wtyczka powinna zawsze uruchamiać oryginalny kod, aby uniknąć uszkodzenia innych modułów.

Mój wniosek:

Jeśli możesz rozważyć podstawową metodę jako czarną skrzynkę z wejściem i jednym wyjściem, a ty jesteś agnostyczny w zakresie jej wewnętrznych mechanizmów, wtyczka może być najlepszą opcją.

Jeśli chcesz zmienić zachowanie wewnętrzne , najlepszym rozwiązaniem może być przepisanie.


Pierwszy scenariusz jest nieco niedokładny (myślę, że to tylko sformułowanie), ponieważ wtyczka przed lub wokół jest uruchamiana (lub może działać) przed właściwym kodem metody.
— David Verholen

Tak, moje sformułowanie było nieprawidłowe. Chodziło mi o względną kolejność sortowania z rzeczywistą metodą.
— Phoenix128_RiccardoT 26.04.16

7

Świetne pytanie, któregoś dnia zadałem sobie to samo i oto, co wymyśliłem:

  • Po pierwsze, wtyczek nie można używać do końcowych metod, klas końcowych i klas utworzonych bez wstrzykiwania zależności Myślę, że to bardzo specyficzny przypadek, ale to jeden przypadek, w którym nie można używać wtyczek
  • Po drugie, należy pamiętać o definicji wtyczki. Służy do pracy na poziomie metody, podczas gdy preferencje są używane do pracy na poziomie całej klasy.Nie jest to oczywiste dla wszystkich, dlatego warto o tym pamiętać.
  • Wreszcie, i uważam, że to najważniejsze, wygląda na to, że wtyczki mogą być używane tylko do przedłużenia działania dowolnej metody publicznej w klasie Magento . Wygląda więc na to, że nie można używać wtyczek z metodami chronionymi / prywatnymi .

Źródło: Kurs podstawowy Magento U


2
Dobrze. Dobre powody. Nie wiem jednak, co powiedzieć o drugim punkcie. Jeśli chcesz pluginować wiele metod publicznych z tej samej klasy, myślę, że najbezpieczniejszym sposobem jest stworzenie jednej klasy, która działa jak wtyczka dla wszystkich z nich. (moja opinia). Pozostawię to otwarte 2-3 dni, aby sprawdzić, czy ktoś wymyśli inne powody. Jeśli nie ... znacznik wyboru należy do Ciebie.
— Marius

@Marius masz absolutną rację, re: drugi punkt. Z niektórych powodów myślałem, że musisz utworzyć kilka plików wtyczek dla każdej metody, którą chcesz pluginować, ale myślę, że tak robią obserwatorzy, a nie wtyczki. Byłoby fajnie, gdyby więcej osób odpowiedziało, czy jest więcej powodów (nieoczywistych).
— Raphael w Digital Pianism

1
@marius jako dodatek: ponieważ wtyczki powinny być specyficzne dla domeny, myślę, że przynajmniej najlepszą praktyką powinno być definiowanie wielu wtyczek tylko w jednej klasie, jeśli są one implementacją tej samej funkcji. Po przepisaniu nie masz tej opcji, ponieważ zawsze zmieniasz całą klasę. Myślę więc, że byłby to jeden z powodów, dla których warto przynajmniej unikać przepisywania
— David Verholen

@DavidVerholen. W pełni się zgadzam. Ale pytałem o powody, aby używać przepisywania zamiast wtyczek.
— Marius

tak, myślę, że może to być powód do używania wtyczek, ponieważ można zdefiniować klasy wtyczek specyficzne dla funkcji, a przepisywanie można wykonać tylko raz
— David Verholen
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.