เขียนใหม่ Magento 2 คลาสเทียบกับปลั๊กอิน


17

Magento 2 มีคอนเซ็ปต์ของPlugins / Interception / Interceptorsซึ่งตรงข้ามกับ Magento 1 การ
กระทำเหล่านี้เหมือนก่อน | หลังเหตุการณ์สำหรับวิธีสาธารณะทุกประการ อันไหนดี
คุณยังสามารถใช้aroundปลั๊กอินเพื่อแทนที่การทำงานของวิธีการ
แต่ Magento 2 ยังคงมีความเป็นไปได้ในการเขียนคลาสมากขึ้นหรือน้อยลงในแบบ M1
ฉันต้องการดูตัวอย่างที่การเขียนคลาสใหม่เป็นวิธีการแทนที่จะใช้ปลั๊กอิน
ฉันรู้ว่าสิ่งนี้มีประโยชน์เมื่อคุณต้องการเปลี่ยนพฤติกรรมของวิธีการป้องกันหลัก แต่มีกรณีอื่น ๆ ที่แนะนำให้เขียนใหม่หรือจำเป็น?


1
ที่เกี่ยวข้อง: magento.stackexchange.com/questions/93932/…
Robbie Averill

คำตอบ:


19

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

แต่ยังพิจารณาสถานการณ์สมมติต่อไปนี้

สถานการณ์ที่ 1 (ลำดับการจัดเรียงแบบสัมบูรณ์):

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

สถานการณ์ที่ 2 (ไม่รวมรหัส):

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

สถานการณ์ที่ 3 (รูปแบบโค้ด):

คุณควรใช้การเขียนซ้ำเมื่อคุณต้องการเขียนพฤติกรรมใหม่ปลั๊กอินควรใช้เพื่อแก้ไขเอาต์พุตหรือรันโค้ดก่อน / หลัง

ปลั๊กอินควรใช้รหัสดั้งเดิมเสมอเพื่อหลีกเลี่ยงการทำลายโมดูลอื่น ๆ

บทสรุปของฉัน:

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

หากคุณต้องการเปลี่ยนพฤติกรรมภายในการเขียนใหม่อาจเป็นตัวเลือกที่ดีที่สุด


สถานการณ์ที่ 1 มีความคลาดเคลื่อนเล็กน้อย (ฉันคิดว่าเป็นเพียงถ้อยคำ) ตั้งแต่ก่อนหรือปลั๊กอินที่เรียกใช้ arround (หรือสามารถเรียกใช้) ก่อนรหัสวิธีจริง
David Verholen

ใช่ถ้อยคำของฉันไม่ถูกต้อง ประเด็นของฉันเกี่ยวกับลำดับการจัดเรียงแบบสัมพันธ์กับวิธีการจริง
Phoenix128_RiccardoT

7

คำถามยอดเยี่ยมฉันถามตัวเองในวันเดียวกันและนี่คือสิ่งที่ฉันคิดไว้:

  • ก่อนอื่นไม่สามารถใช้ปลั๊กอินสำหรับวิธีสุดท้ายคลาสสุดท้ายและคลาสที่สร้างขึ้นโดยไม่ต้องพึ่งพาการฉีดฉันคิดว่าเป็นกรณีที่เฉพาะเจาะจงมาก แต่เป็นกรณีหนึ่งที่คุณไม่สามารถใช้ปลั๊กอินได้
  • ประการที่สองคุณต้องคำนึงถึงคำจำกัดความของปลั๊กอิน มันถูกใช้เพื่อทำงานในระดับวิธีการในขณะที่การตั้งค่าจะใช้ในการทำงานในระดับชั้นทั้งหมด ไม่ชัดเจนสำหรับทุกคนดังนั้นจึงควรระลึกไว้เสมอ
  • ในที่สุดและฉันคิดว่ามันสำคัญที่สุดดูเหมือนว่าปลั๊กอินสามารถใช้เพื่อขยายพฤติกรรมของวิธีสาธารณะในคลาสวีโอไอพีเท่านั้น ดังนั้นมันจึงดูเหมือนว่าคุณไม่สามารถใช้ปลั๊กอินที่มีการป้องกันการเอกชน /

ที่มา: Magento U Fundamental Course


2
ตกลง. เหตุผลที่ดี ฉันไม่รู้ว่าจะพูดอะไรเกี่ยวกับประเด็นที่สอง หากคุณต้องการใช้วิธีสาธารณะจำนวนมากจากคลาสเดียวกันฉันคิดว่าวิธีที่ปลอดภัยที่สุดคือการสร้างคลาสเดียวที่ทำหน้าที่เป็นปลั๊กอินสำหรับพวกเขาทั้งหมด (ความคิดเห็นของฉัน). ฉันจะปล่อยให้เปิด 2-3 วันเพื่อดูว่ามีใครมาด้วยเหตุผลอื่น ๆ ถ้าไม่ใช่ .... เครื่องหมายถูกเป็นของคุณ
Marius

@Marius คุณอย่างถูกต้องอีกครั้ง: จุดที่สอง ด้วยเหตุผลบางอย่างฉันคิดว่าคุณต้องสร้างไฟล์ปลั๊กอินหลาย ๆ ไฟล์สำหรับทุกวิธีที่คุณต้องการเปลี่ยนแปลง แต่ฉันคิดว่านั่นเป็นสิ่งที่ผู้สังเกตการณ์ทำไม่ใช่ปลั๊กอิน มันคงจะเจ๋งถ้ามีคนตอบกลับมามากขึ้นเพื่อดูว่ามีเหตุผลมากมาย (ไม่ชัดเจน)
Raphael ที่ Digital Pianism

1
@marius เป็นการเพิ่ม: เนื่องจากปลั๊กอินควรเป็นโดเมนเฉพาะฉันคิดว่าอย่างน้อยก็ควรมีวิธีปฏิบัติที่ดีที่สุดในการกำหนดปลั๊กอินหลายรายการในหนึ่งคลาสหากใช้งานคุณลักษณะเดียวกัน ด้วยการเขียนซ้ำคุณไม่มีตัวเลือกนี้เนื่องจากคุณเปลี่ยนคลาสทั้งหมดเสมอ ดังนั้นฉันคิดว่านั่นเป็นเหตุผลหนึ่งที่อย่างน้อยก็พยายามหลีกเลี่ยงการเขียนซ้ำ
David Verholen

@DavidVerholen ฉันเห็นด้วยอย่างยิ่ง แต่ฉันถามหาเหตุผลในการใช้การเขียนซ้ำแทนปลั๊กอิน
Marius

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