Magento2: sự khác biệt cơ bản giữa plugin và sở thích là gì?


47

Tôi đã sử dụng cả plugin và ưu tiên trong hướng dẫn magento2 và cả hai đều hoạt động tốt nhưng sự khác biệt cơ bản giữa chúng là gì.

Mã cho plugin:

1.1) Thêm một khai báo plugin vào di.xml:

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

1.2) Tạo một lớp plugin:

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

Mã ưu tiên:

2.1) Tạo một tuyên bố ưu tiên:

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

2.2) Tạo một lớp sản phẩm mới:

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

Câu trả lời:


59

Một sở thích tương đương với việc viết lại lớp từ Magento 1. Nó tương đương với câu nói, "Bất cứ khi nào mã yêu cầu ClassA, hãy MyClassBthay thế chúng ." MyClassBdự kiến ​​sẽ là một triển khai hoàn chỉnh ClassA, cộng với bất kỳ hành vi nào bạn thêm hoặc sửa đổi trên đầu trang.

Như trong Magento 1, chỉ một ưu tiên (viết lại) có thể được kích hoạt cho một lớp trừ khi bạn xâu chuỗi chúng theo cách thủ công (chẳng hạn như MyClassBkéo dài OtherClassBOtherClassBkéo dài ClassA).

Một plugin cho phép bạn thực thi mã trước, xung quanh hoặc sau các phương thức từ lớp mà bạn đang nối vào. Lớp plugin của bạn không thay thế lớp đích và nó không phải là một thể hiện của nó. Bạn chỉ cần có phương pháp before{method}, around{method}, after{method}mà được thực hiện vào thời điểm thích hợp trong đối với {} phương pháp trên lớp mục tiêu.

Vì các plugin không thay thế lớp đích, nên bất kỳ số lượng plugin nào cũng có thể được kích hoạt đồng thời trên một lớp. Magento chỉ thực hiện lần lượt từng cái dựa trên tham số sortOrder trong XML của bạn.

Do đó, plugin linh hoạt hơn nhiều so với sở thích. Bạn nên sử dụng plugin bất cứ khi nào có thể và tránh các tùy chọn để viết lại các lớp trừ khi thực sự cần thiết.

Bạn có thể đọc thêm về cách các plugin hoạt động và cách sử dụng chúng trong tài liệu chính thức .


Ưu tiên không tương đương với viết lại lớp. Đó là cách để cung cấp thực hiện mặc định cho các giao diện.
KAndy

1
@KAndy Đó có thể là mục đích dự định cơ bản, nhưng một tác dụng phụ của việc đó là chúng cũng hoạt động cho lớp ghi đè. Về mặt ngữ nghĩa chúng giống nhau. Viết lại lớp thông qua các sở thích là những gì Yogesh đã hỏi về, và cũng là những gì Bài tập cơ bản mà anh ấy đang làm hướng dẫn bạn làm.
Ryan Hoerr

12

Nói một cách đơn giản

Ưu tiên được sử dụng cho lớp ghi đè

Plugin được sử dụng để thêm chức năng trước, sau và xung quanh các phương thức.

Ví dụ như của bạn:

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

Bất cứ khi nào mã yêu cầu List sản phẩm, ưu tiên nói rằng

Này, sử dụng Vendor\MyModule\Block\Product\ListProduct thay vì 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>

Bất cứ khi nào mã yêu cầu getprice (), plugin nói rằng

Hey sử dụng getPrice() phương pháp của tôi trước, sau và xung quanh phương pháp của bạngetPrice()


1

Tóm lại :

Ưu tiên được sử dụng để chỉ định thực hiện mặc định của một giao diện.

Plugin (Interceptor) được sử dụng để mở rộng hành vi của một phương thức công khai của một lớp khác.

Chi tiết :

Ưu tiên: Nếu có nhiều hơn một lớp thực hiện một giao diện, thì điều quan trọng là chỉ định một mặc định của tất cả các lớp được triển khai. Điều này được thực hiện thông qua nút ưu tiên trong tệp tiêm phụ thuộc (di.xml).

Thí dụ :

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

Ánh xạ này nằm trong app/etc/di.xml, vì vậy trình quản lý đối tượng tiêm vào Magento\Core\Model\Urllớp triển khai bất cứ nơi nào có yêu cầu Magento\Core\Model\UrlInterfacetrong phạm vi toàn cầu.

Plugin (Đánh chặn):

Nói, một lớp Acó phương thức methodAcần một chức năng mở rộng. Sau đó, điều này đạt được thông qua Plugins bằng cách tạo lớp APluginmà không sửa đổi lớp gốc A. Lớp APlugincó các phương thức chạy trước, sau hoặc xung quanh phương thức cần thiết.

Thí dụ :

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

Ánh xạ này nằm trong app / etc / di.xml. Một / Vài Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockphương thức lớp được thực thi trước / sau / xung quanh các Magento\Catalog\Model\Plugin\ShowOutOfStockConfigphương thức lớp .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.