Magento2: Eklenti ve tercih arasındaki temel fark nedir?


47

Magento2 eğitiminde hem eklenti hem de tercih kullandım ve her ikisi de iyi çalışıyor, ancak aralarındaki temel fark nedir.

Eklenti kodu:

1.1) di.xml dosyasına bir eklenti bildirimi ekleyin:

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

1.2) Bir eklenti sınıfı oluşturun:

<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}

Tercih için kod:

2.1) Bir tercih beyanı oluşturun:

<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />

2.2) Yeni bir Ürün sınıfı oluşturun:

<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}

Yanıtlar:


58

Tercih, Magento 1'deki sınıf yeniden yazmaya eşdeğerdir. "Kod ne zaman isterse ClassA, MyClassByerine ver " demeye eşdeğerdir . MyClassBEk olarak ClassAeklediğiniz veya değiştirdiğiniz davranışların eksiksiz bir uygulaması olması beklenir .

Magento 1'de olduğu gibi, onları manuel olarak zincirlemediğiniz sürece (bir kez MyClassBuzayan OtherClassBve OtherClassBuzayan ClassA) yalnızca bir tercih (yeniden yazma) bir kerede bir sınıf için etkin olabilir .

Eklenti, üzerine taktığınız sınıftaki yöntemlerden önce, çevresinde veya sonrasında kod yürütmenize olanak tanır. Eklenti sınıfınız hedef sınıfın yerini almaz ve bunun bir örneği değildir. Sadece yöntemleri var before{method}, around{method}, after{method}hedef sınıfına {yönteme} açısından uygun zamanda idam.

Eklentiler hedef sınıfın yerini almadığından, herhangi bir sayıda eklenti bir sınıfta aynı anda aktif olabilir. Magento, XML'in sortOrder parametresini temel alarak birbiri ardına çalıştırır.

Bu nedenle, eklentiler tercihlerden çok daha esnektir. Mümkünse eklentileri kullanmalı ve kesinlikle gerekmedikçe ders yazma tercihlerinden kaçınmalısınız.

Eklentilerin nasıl çalıştığı ve bunları resmi belgelerde nasıl kullanacağınız hakkında daha fazla bilgi edinebilirsiniz .


Tercih, sınıf yeniden yazmaya eşdeğer değildir. Arayüzler için varsayılan uygulama sağlamanın yoludur.
KAndy

1
@KAndy Bu amaçlanan temel amaç olabilir, ancak bunun bir yan etkisi de sınıf üstünlüğü için çalışmaktır. Anlamsal olarak onlar aynı. Tercihler yoluyla sınıf yeniden yazma, Yogesh'in sorduğu şey ve ayrıca üzerinde çalıştığı Temel Egzersizleri yapmamızı ister.
Ryan Hoerr

12

Basit bir deyişle

Sınıf geçersiz kılma için tercih kullanılır

Eklenti, yöntemlerden önce, sonra ve çevresinde işlevsellik eklemek için kullanılır.

Örnek olarak:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

Kod ne zaman ListProduct isterse, tercih

Hey, yerine kullanVendor\MyModule\Block\Product\ListProduct Magento\Catalog\Block\Product\ListProduct

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

Kod getPrice () ne zaman isterse, eklenti şunu söyledi:

Hey benim kullanmak getPrice() yöntemini, önce sonra ve çevresinde getPrice() yöntemle


1

Kısaca :

Bir arayüzün varsayılan uygulamasını belirlemek için tercih kullanılır.

Eklenti (Interceptor), başka bir sınıfın genel bir yönteminin davranışını genişletmek için kullanılır.

Detayda :

Tercih: Bir arabirim uygulayan birden fazla sınıf varsa, uygulanan tüm sınıflardan varsayılanını belirlemek önemlidir. Bu, bağımlılık enjeksiyon dosyasındaki (di.xml) tercih düğümü vasıtasıyla yapılır.

Örnek :

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

Bu haritalama app/etc/di.xmliçindedir, bu nedenle nesne yöneticisi , genel kapsam Magento\Core\Model\Urliçin bir talebin olduğu yerde uygulama sınıfına enjekte eder Magento\Core\Model\UrlInterface.

Eklenti (Interceptor):

Bir sınıfın genişletilmiş bir işlevsellik gerektiren bir Ayöntemi methodAolduğunu söyleyin . Daha sonra, APluginorijinal sınıfı değiştirmeden sınıf oluşturarak Eklentiler aracılığıyla bu başarılır A. Sınıf APlugin, gerekli yöntemin öncesinde, sonrasında veya çevresinde çalışan metotlara sahiptir.

Örnek :

<config>
    <type name="Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock">
        <plugin name="showOutOfStockValueChanged" type="Magento\Catalog\Model\Plugin\ShowOutOfStockConfig"/>
    </type>
</config>

Bu haritalama / etc / di.xml dosyasında. Sınıf Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockyöntemlerinden biri / birkaçı, sınıf Magento\Catalog\Model\Plugin\ShowOutOfStockConfigyöntemlerinden önce / sonra / etrafında yürütülür .

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.