Magento2: ความแตกต่างพื้นฐานระหว่างปลั๊กอินและการตั้งค่าคืออะไร?


47

ฉันใช้ทั้งปลั๊กอินและการตั้งค่าในการกวดวิชา magento2 และทั้งสองทำงานได้ดี แต่สิ่งที่แตกต่างพื้นฐานระหว่างพวกเขาคือ

รหัสสำหรับปลั๊กอิน:

1.1) เพิ่มการประกาศปลั๊กอินใน di.xml:

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

1.2) สร้างคลาสปลั๊กอิน:

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

รหัสสำหรับการตั้งค่า:

2.1) สร้างการประกาศค่ากำหนด:

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

2.2) สร้างคลาสสินค้าใหม่:

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

คำตอบ:


58

การตั้งค่าจะเทียบเท่ากับการเขียนคลาสใหม่จาก Magento 1 มันเทียบเท่ากับการพูดว่า "เมื่อใดก็ตามที่รหัสขอClassAให้ให้พวกเขาMyClassBแทน" MyClassBคาดว่าจะเป็นการใช้งานที่สมบูรณ์ClassAรวมถึงพฤติกรรมใด ๆ ก็ตามที่คุณเพิ่มหรือแก้ไขด้านบน

เช่นเดียวกับ Magento 1 การตั้งค่า (เขียนใหม่) เพียงครั้งเดียวสามารถใช้งานได้สำหรับชั้นเรียนในครั้งเดียวเว้นแต่ว่าคุณจะเชื่อมโยงพวกเขาด้วยตนเอง (เช่นที่MyClassBขยายOtherClassBและOtherClassBขยายClassA)

ปลั๊กอินช่วยให้คุณสามารถรันโค้ดก่อน, รอบ, หรือหลังเมธอดจากคลาสที่คุณกำลังเชื่อมต่อ คลาสปลั๊กอินของคุณไม่ได้แทนที่คลาสเป้าหมายและไม่ใช่อินสแตนซ์ของมัน คุณเพียงแค่มีวิธีการbefore{method}, around{method}, after{method}ซึ่งได้รับการดำเนินการในเวลาที่เหมาะสมในแง่ {} วิธีการในระดับเป้าหมาย

เนื่องจากปลั๊กอินไม่ได้แทนที่คลาสเป้าหมายดังนั้นจำนวนปลั๊กอินใด ๆ จึงสามารถใช้งานได้ในคลาสพร้อมกัน วีโอไอพีเพียงแค่เรียกใช้พวกเขาทีละอย่างโดยอิงตามพารามิเตอร์ sortOrder ใน XML ของคุณ

ด้วยเหตุนี้ปลั๊กอินจึงมีความยืดหยุ่นมากกว่าการตั้งค่า คุณควรใช้ปลั๊กอินทุกครั้งที่ทำได้และหลีกเลี่ยงการตั้งค่าสำหรับการเขียนคลาสใหม่เว้นแต่จำเป็นจริงๆ

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิธีการทำงานของปลั๊กอินและวิธีการใช้พวกเขาในเอกสารอย่างเป็นทางการ


การตั้งค่าไม่เทียบเท่ากับการเขียนคลาสใหม่ มันเป็นวิธีที่จะให้การใช้งานเริ่มต้นสำหรับอินเทอร์เฟซ
KAndy

1
@ KAndy นั่นอาจเป็นจุดประสงค์พื้นฐาน แต่ผลข้างเคียงของมันคือพวกมันยังสามารถใช้ในการเอาชนะชั้นเรียนได้ ความหมายพวกมันเหมือนกัน การเขียนชั้นเรียนใหม่ผ่านการตั้งค่าเป็นสิ่งที่โยเกชถามและสิ่งที่เขาฝึกขั้นพื้นฐานก็คือการสอนให้คุณทำ
Ryan Hoerr

12

ในคำง่าย ๆ

การตั้งค่าจะใช้สำหรับชั้นเรียนที่เอาชนะ

ปลั๊กอินใช้สำหรับเพิ่มฟังก์ชันการทำงานก่อนหลังและรอบวิธี

สำหรับตัวอย่างของคุณ:

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

เมื่อใดก็ตามที่รหัสขอ ListProduct การตั้งค่าก็บอก

เฮ้ใช้ Vendor\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>

เมื่อใดก็ตามที่รหัสขอ getPrice () ปลั๊กอินจะกล่าวว่า

สวัสดีใช้ getPrice() วิธี ของฉันก่อนหลังและรอบวิธีของคุณgetPrice()


1

โดยย่อ:

การกำหนดค่าตามความชอบใช้เพื่อระบุการใช้งานเริ่มต้นของอินเตอร์เฟส

ปลั๊กอิน (Interceptor) ใช้เพื่อขยายพฤติกรรมของวิธีสาธารณะของคลาสอื่น

ในรายละเอียด :

การตั้งค่า: หากมีมากกว่าหนึ่งคลาสที่ใช้อินเทอร์เฟซก็เป็นสิ่งสำคัญที่จะต้องระบุค่าเริ่มต้นหนึ่งในชั้นเรียนดำเนินการทั้งหมด สิ่งนี้ทำผ่านโหนดการกำหนดค่าตามความชอบในไฟล์การฉีดพึ่งพา (di.xml)

ตัวอย่าง:

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

การแม็พนี้อยู่ในapp/etc/di.xmlดังนั้นตัวจัดการวัตถุจะแทรกMagento\Core\Model\Urlคลาสการนำไปใช้ทุกที่ที่มีการร้องขอMagento\Core\Model\UrlInterfaceในขอบเขตส่วนกลาง

ปลั๊กอิน (ตัวดัก):

สมมติว่าคลาสAมีวิธีmethodAที่ต้องการฟังก์ชันการทำงานเพิ่มเติม แล้วนี้จะประสบความสำเร็จผ่านปลั๊กอินโดยการสร้างชั้นโดยไม่ต้องปรับเปลี่ยนระดับเดิมAPlugin Aชั้นเรียนAPluginมีวิธีการที่ทำงานก่อนหลังหรือรอบวิธีที่จำเป็น

ตัวอย่าง:

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

การแม็พนี้อยู่ใน app / etc / di.xml หนึ่ง / ไม่กี่แห่งMagento\CatalogInventory\Model\Config\Backend\ShowOutOfStockวิธีการเรียนจะดำเนินการก่อน / หลัง / รอบMagento\Catalog\Model\Plugin\ShowOutOfStockConfigวิธีการเรียน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.