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;
}
}
sumber
Dengan kata-kata sederhana
Sebagai Sebagai Contoh Anda:
Setiap kali kode meminta ListProduct, preferensi mengatakan itu
Hei, gunakan
Vendor\MyModule\Block\Product\ListProduct
bukanMagento\Catalog\Block\Product\ListProduct
Setiap kali kode meminta getPrice (), plugin mengatakan itu
Hei, gunakan
getPrice()
metode saya sebelum, sesudah dan sekitar metode AndagetPrice()
sumber
Secara singkat :
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:
Pemetaan ini dalam
app/etc/di.xml
, jadi manajer objek menyuntikkanMagento\Core\Model\Url
kelas implementasi di mana pun ada permintaan untukMagento\Core\Model\UrlInterface
dalam lingkup global.Plugin (Interceptor):
Katakanlah, sebuah kelas
A
memiliki metodemethodA
yang membutuhkan fungsionalitas yang diperluas. Kemudian, ini dicapai melalui Plugins dengan membuat kelasAPlugin
tanpa memodifikasi kelas asliA
. KelasAPlugin
memiliki metode yang berjalan sebelum, setelah atau di sekitar metode yang diperlukan.Contoh:
Pemetaan ini ada di app / etc / di.xml. Satu / Beberapa
Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock
metode kelas dieksekusi sebelum / sesudah / sekitarMagento\Catalog\Model\Plugin\ShowOutOfStockConfig
metode kelas .sumber