Magento 2 sınıflarını Eklentilerle Yeniden Yazma


17

Magento 2, Magento 1'e karşı olan Eklentiler / Müdahale / Durdurucular kavramına sahiptir .
Bunlar, her genel yöntem için olaydan önce | Hangisi güzel. Eklentiyi, bir yöntemin işlevselliğini değiştirmek için
de kullanabilirsiniz around.
Ancak Magento 2, M1 yolunu az çok yeniden yazma imkanı sunuyor.
Yeniden yazma sınıfları eklentileri kullanmak yerine gitmek için yol olduğu bazı örnekler görmek istiyorum.
Çekirdek korumalı bir yöntemin davranışını değiştirmek istediğinizde bunun yararlı olduğunu biliyorum, ancak yeniden yazmanın önerildiği veya gerekli olduğu başka durumlar var mı?


Yanıtlar:


19

Eklenti yerine yeniden yazma kullanmanın bariz nedeni, özel, korumalı veya son yöntemleri geçersiz kılmanız gerektiğidir .

Ancak aşağıdaki senaryoları da göz önünde bulundurun.

1. senaryo (mutlak sıralama düzeni):

Eklentilerden önce kodunuzun çalıştırılması gerektiğinde yeniden yazma işlemi yararlı olabilir . Eklentiyi ayarlayarak bunu yapabileceğinizi biliyorum sortOrder, ancak kodunuz her zaman birisinin (siz değil) 3. taraf bileşenleri yükleyeceği zaman ilk olacağından emin olamazsınız.

2. senaryo (kodu hariç tut):

Bir yöntemde yalnızca bir kod parçasını hariç tutmanız veya yeniden yazmanız gerekiyorsa , eklenti en uygun olmayan yol olabilir. Bir aroundeklenti kullanabilir ve çağırmaktan kaçınabileceğinizi biliyorum proceed, ancak bu yığındaki diğer eklentileri kırabilir.

3. senaryo (kod stili):

Bir davranışı yeniden yazmanız gerektiğinde yeniden yazma işlemi kullanmalısınız , çıktıyı değiştirmek için eklentiler kullanılmalıdır veya kodu önce / sonra çalıştırmak .

Bir eklenti, diğer modülleri bozmamak için daima orijinal kodu çalıştırmalıdır .

Benim sonucum:

Çekirdek bir yöntemi kara kutu olarak düşünebilirsiniz bir girişi ve bir çıkışı olan bir ve iç mekanizmaları hakkında agnostik iseniz, bir eklenti en iyi seçenek olabilir.

Dahili davranışı değiştirmeniz gerekirse , yeniden yazma en iyi seçenek olabilir.


1 veya daha önce bir eklenti gerçek yöntem kodundan önce çalıştığından (veya çalıştırabildiğinden) 1 senaryosu biraz yanlış (sanırım sadece ifade).
David Verholen

Evet, ifadem doğru değildi. Demek istediğim, gerçek yöntemle göreli sıralama düzeni hakkındaydı.
Phoenix128_RiccardoT

7

Harika bir soru, geçen gün kendime aynı şeyi sordum ve işte ne buldum:

  • İlk olarak, eklentiler son yöntemler, son sınıflar ve bağımlılık enjeksiyonu olmadan oluşturulan sınıflar için kullanılamaz Bunun çok özel bir durum herhalde ama bu eklentileri kullanamazsınız bir durum
  • İkincisi, bir eklentinin tanımını aklınızda bulundurmanız gerekir. Yöntem düzeyinde çalışmak için kullanılırken, tercihler tüm sınıf düzeyinde çalışmak için kullanılır. Herkes için açık değildir, bu yüzden bunu akılda tutmak iyidir.
  • Son olarak ve bunun en önemli olduğunu düşünüyorum, eklentiler sadece bir Magento sınıfındaki herhangi bir genel yöntemin davranışını genişletmek için kullanılabilir gibi görünüyor . Bu nedenle, eklentileri korumalı / özel yöntemlerle kullanamazsınız .

Kaynak: Magento U Temel Kursu


2
Tamam. Iyi sebepler. İkinci nokta hakkında ne söyleyeceğimi bilmiyorum. Aynı sınıftan çok sayıda genel yöntemi eklemek istiyorsanız, en güvenli yolun hepsi için bir eklenti görevi gören tek bir sınıf oluşturmak olduğunu düşünüyorum. (benim fikrim). Birisinin başka nedenlerle ortaya çıkıp çıkmadığını görmek için bunu 2-3 gün açık bırakacağım. Değilse .... onay işareti sizindir.
Marius

@Marius kesinlikle haklısın: ikinci nokta. Bazı nedenlerden dolayı, takmak istediğiniz her yöntem için birkaç eklenti dosyası oluşturmanız gerektiğini düşündüm, ancak bence gözlemciler eklentiler değil. Daha fazla kişi daha fazla neden olup olmadığını görmek için cevap verirse bu harika olurdu (açık değil).
Raphael, Dijital Piyanizm'de

1
ek olarak: Eklentiler Etki Alanına özel olmalı, aynı özelliğin bir uygulamasıysa, birden fazla eklentiyi yalnızca bir sınıfta tanımlamanın en azından en iyi uygulama olması gerektiğini düşünüyorum. Yeniden yazma ile, tüm seçeneği her zaman değiştirdiğiniz için bu seçeneğiniz olmaz. Bu yüzden en azından yeniden yazmalardan kaçınmaya çalışmanın bir nedeni olacağını düşünüyorum
David Verholen

@DavidVerholen. Tamamen katılıyorum. Ama eklenti yerine yeniden yazma kullanmak için nedenler soruyordum.
Marius

Evet, özelliğe özgü eklenti sınıflarını tanımlayabildiğiniz için bu eklentileri kullanmanın bir nedeni olabileceğini düşünüyorum, yeniden yazma yalnızca bir kez yapılabilir
David Verholen 26:16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.