Magento2: apa perbedaan mendasar antara plugin dan preferensi?

47

Saya menggunakan plugin dan preferensi dalam tutorial magento2 dan keduanya bekerja dengan baik tetapi apa perbedaan mendasar di antara mereka.

Kode untuk plugin:

1.1) Tambahkan deklarasi plugin ke dalam.xml:

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

1.2) Buat kelas plugin:

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

Kode untuk preferensi:

2.1) Buat deklarasi preferensi:

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

2.2) Buat kelas Produk baru:

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

Jawaban:

59

Preferensi setara dengan penulisan ulang kelas dari Magento 1. Ini setara dengan mengatakan, "Setiap kali kode meminta ClassA, berikan mereka MyClassBsebagai gantinya." MyClassBdiharapkan menjadi implementasi lengkap dari ClassA, ditambah perilaku apa pun yang Anda tambahkan atau modifikasi di atas.

Seperti di Magento 1, hanya satu preferensi (menulis ulang) yang dapat aktif untuk suatu kelas pada satu waktu kecuali Anda rantai secara manual (sedemikian rupa sehingga MyClassBmeluas OtherClassB, dan OtherClassBmeluas ClassA).

Plugin memungkinkan Anda untuk mengeksekusi kode sebelum, di sekitar, atau setelah metode dari kelas yang Anda gunakan. Kelas plugin Anda tidak menggantikan kelas target, dan itu bukan turunannya. Anda hanya memiliki metode before{method}, around{method}, after{method}yang dijalankan pada waktu yang tepat sehubungan dengan {metode} di kelas target.

Karena plugin tidak menggantikan kelas target, sejumlah plugin dapat aktif di kelas secara bersamaan. Magento hanya mengeksekusi mereka satu demi satu berdasarkan parameter sortOrder di XML Anda.

Karena itu, plugin jauh lebih fleksibel daripada preferensi. Anda harus menggunakan plugin jika memungkinkan, dan menghindari preferensi untuk menulis ulang kelas kecuali benar-benar diperlukan.

Anda dapat membaca lebih lanjut tentang cara kerja plugin dan cara menggunakannya dalam dokumentasi resmi .

Ryan Hoerr
sumber
Preferensi tidak setara dengan penulisan ulang kelas. Ini adalah cara untuk menyediakan implementasi standar untuk antarmuka.
KAndy
1
@KAndy Itu mungkin tujuan dasar yang dimaksudkan, tetapi efek sampingnya adalah mereka juga bekerja untuk pengesampingan kelas. Secara semantik keduanya sama. Menulis ulang kelas melalui preferensi adalah apa yang diminta Yogesh, dan juga latihan dasar apa yang sedang dia kerjakan memerintahkan Anda untuk melakukannya.
Ryan Hoerr
12

Dengan kata-kata sederhana

Preferensi digunakan untuk kelas utama

Plugin digunakan untuk menambahkan fungsionalitas sebelum, sesudah dan di sekitar metode.

Sebagai Sebagai Contoh Anda:

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

Setiap kali kode meminta ListProduct, preferensi mengatakan itu

Hei, gunakan Vendor\MyModule\Block\Product\ListProduct bukan 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>

Setiap kali kode meminta getPrice (), plugin mengatakan itu

Hei, gunakan getPrice() metode saya sebelum, sesudah dan sekitar metode AndagetPrice()

Pangeran Patel
sumber
1

Secara singkat :

Preferensi digunakan untuk menentukan implementasi default suatu antarmuka.

Plugin (Interceptor) digunakan untuk memperluas perilaku metode publik dari kelas lain.

Secara terperinci :

Preferensi: Jika ada lebih dari satu kelas yang mengimplementasikan antarmuka, maka penting untuk menentukan default dari semua kelas yang diimplementasikan. Ini dilakukan melalui node preferensi dalam file injeksi ketergantungan (di.xml).

Contoh:

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

Pemetaan ini dalam app/etc/di.xml, jadi manajer objek menyuntikkan Magento\Core\Model\Urlkelas implementasi di mana pun ada permintaan untuk Magento\Core\Model\UrlInterfacedalam lingkup global.

Plugin (Interceptor):

Katakanlah, sebuah kelas Amemiliki metode methodAyang membutuhkan fungsionalitas yang diperluas. Kemudian, ini dicapai melalui Plugins dengan membuat kelas APlugintanpa memodifikasi kelas asli A. Kelas APluginmemiliki metode yang berjalan sebelum, setelah atau di sekitar metode yang diperlukan.

Contoh:

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

Pemetaan ini ada di app / etc / di.xml. Satu / Beberapa Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockmetode kelas dieksekusi sebelum / sesudah / sekitar Magento\Catalog\Model\Plugin\ShowOutOfStockConfigmetode kelas .

nikin
sumber