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?

Marius
źródło
1
Powiązane: magento.stackexchange.com/questions/93932/…
Robbie Averill

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.

Phoenix128_RiccardoT
źródło
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

Raphael at Digital Pianism
źródło
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