Magento 2: Plugin vs Observer


27

ใน Magento 2 ข้อดีและข้อเสียของการใช้ปลั๊กอินกับผู้สังเกตการณ์เพื่อให้ได้อะไร

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


ผู้สังเกตการณ์จะถูก จำกัด มาก แต่ปลั๊กอินที่คุณทำการเปลี่ยนแปลงสำหรับฟังก์ชั่นสาธารณะทั้งหมด
Pradeep Kumar

คำตอบ:


42

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

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


ลองดูคำตอบที่พูดถึงการตั้งค่าเทียบกับปลั๊กอิน / ผู้สังเกตการณ์: magento.stackexchange.com/a/94035/697ซึ่งอาจเป็นประโยชน์
Alex Paliarush

@alex: - วิธีการเขียนปลั๊กอินสำหรับฟังก์ชั่นการป้องกันกรณีส่วนใหญ่เราต้องแทนที่ฟังก์ชั่นการป้องกันในสถานการณ์ที่ว่าจะทำอย่างไร? magento.stackexchange.com/questions/91353/…
Pradeep Kumar

@PradeepKumar ปลั๊กอินสามารถเพิ่มลงในวิธีสาธารณะเท่านั้น คำถามที่คุณกล่าวถึงมีคำตอบ แต่การแก้ปัญหาที่เสนอถูกบล็อก แต่ปัญหาที่ทราบ (ปลั๊กอินไม่สามารถใช้กับประเภทเสมือน) เพื่อเป็นการแก้ปัญหาชั่วคราวคุณสามารถประกาศปลั๊กอินสำหรับคลาส URL เฟรมเวิร์กและมีการเพิ่มตรรกะตามเงื่อนไขตามข้อโต้แย้ง (เพื่อให้ปลั๊กอินทำบางอย่างในกรณีของคุณเท่านั้น)
Alex Paliarush

ฉันยื่นให้ตัวอย่างหนึ่งมีฟังก์ชันจำนวนมากในการป้องกันในกรณีที่วิธีการแทนที่วิธีที่ฉันมีเพื่อแทนที่ฟังก์ชั่นการป้องกันใด ๆ
Pradeep Kumar

@PradeepKumar หากคุณต้องการแทนที่วิธีการป้องกันคุณอาจต้องขยายคลาสและใช้การตั้งค่า / การเขียนใหม่ อย่างไรก็ตามขอแนะนำให้คุณถามคำถามแทนที่จะแสดงความคิดเห็นเหล่านี้
Robbie Averill

1

ตามคำแนะนำทางเทคนิคของ Magento ( https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events ): ค่าทั้งหมด (รวมถึงวัตถุ) ที่ส่งไปยังเหตุการณ์ต้องไม่เป็น แก้ไขในผู้สังเกตการณ์เหตุการณ์ ควรใช้ปลั๊กอินแทนการแก้ไขอินพุตหรือเอาต์พุตของฟังก์ชัน

สำหรับฉันความแตกต่างที่สำคัญระหว่างปลั๊กอินและผู้สังเกตคือ:

  1. โปรแกรมเสริมสามารถปรับเปลี่ยนวิธีสาธารณะเท่านั้นในขณะที่ผู้สังเกตการณ์สามารถปรับเปลี่ยนส่วนตัวได้รับการคุ้มครองเช่นกัน
  2. มีการเรียงลำดับสำหรับปลั๊กอิน แต่ไม่มีลำดับการเรียงสำหรับผู้สังเกตการณ์
  3. คุณสามารถเพิ่มผู้สังเกตการณ์ให้กับกิจกรรมที่ส่งไปแล้วใน Magento เท่านั้น ปลั๊กอินมีความยืดหยุ่นมากกว่าที่นี่

ฉันสามารถอัปเดตคำสั่งซื้อกับผู้สังเกตการณ์ได้ด้วยใช่ไหม
Robbie Averill

@ RobbieAverill ใช่แล้วคุณสามารถสร้างผู้สังเกตการณ์สำหรับcheckout_submit_all_afterเหตุการณ์ได้ ผู้สังเกตการณ์ของคุณจะถูกเรียกใช้หลังจากสั่งซื้อเรียบร้อยแล้ว
transversus

นั่นหมายความว่า“ พวกเขาไม่แก้ไขข้อมูล” ไม่เป็นความจริงในกรณีนั้นหรือไม่?
Robbie Averill

1
ใช่คุณถูกต้อง @RobbieAverill ทั้งปลั๊กอินและผู้สังเกตการณ์สามารถแก้ไขข้อมูลได้ สำหรับฉันความแตกต่างที่สำคัญระหว่างปลั๊กอินและผู้สังเกตการณ์คือ: 1. ปลั๊กอินสามารถแก้ไขวิธีการสาธารณะเท่านั้นในขณะที่ผู้สังเกตการณ์สามารถปรับเปลี่ยนส่วนตัวได้รับการคุ้มครองเช่นกัน 2. มีลำดับการเรียงสำหรับปลั๊กอิน แต่ไม่มีการเรียงลำดับสำหรับผู้สังเกตการณ์ 3. คุณสามารถเพิ่มผู้สังเกตการณ์ให้กับกิจกรรมที่ส่งไปแล้วใน Magento เท่านั้น ปลั๊กอินมีความยืดหยุ่นมากกว่าที่นี่
transversus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.