เมื่อใดที่จะส่งเหตุการณ์ในโมดูลที่กำหนดเอง


14

นี่เป็นคำถามเกี่ยวกับทั้ง Magento 1 และ Magento 2

ฉันเข้าใจว่าในทางปฏิบัติผู้พัฒนาโมดูลบุคคลที่สามได้รับการสนับสนุนให้จัดส่งกิจกรรมในโมดูลที่กำหนดเองเพื่อให้ทำงานกับโมดูลอื่นได้ง่ายขึ้น

ผมอยากจะรู้ว่า:

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

ใช่! คำถามที่ดี. ใครก็ได้โปรดตอบคำถามนี้ มันจะมีประโยชน์มากสำหรับนักพัฒนาส่วนขยายบุคคลที่สามเช่นเดียวกับโครงการที่กำหนดเอง
mapaladiya

คำตอบ:


10

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

เนื่องจากไม่น่าพอใจคุณต้องการให้โมดูลของคุณส่งเหตุการณ์เมื่อมีการกระทำบางอย่างที่โมดูลของคุณใช้เพื่อให้ผู้ใช้ของคุณอาจต้องการเพิ่มรายการไปยังลบรายการจากเปลี่ยนแปลงหรือดำเนินการแยกต่างหากโดยไม่ขึ้นกับการกระทำดั้งเดิม ตัวอย่างเช่นMagento มีvisitor_initกิจกรรมที่ไม่ได้เป็นส่วนหนึ่งของชุดกิจกรรมมาตรฐานที่สร้างขึ้นโดยอัตโนมัติ เหตุการณ์นี้ทำให้โปรแกรมเมอร์สามารถแก้ไข objet ของผู้เยี่ยมชมได้ก่อนที่ Magento จะบันทึกข้อมูล สิ่งเหล่านี้ไม่มีทางที่ผู้พัฒนาโมดูลดั้งเดิมจะรู้อย่างแน่นอนนี่คือสิ่งที่จำเป็นต้องมีการเพิ่มเหตุการณ์ - มันอาจมาจากการร้องขอคุณสมบัติและ / หรือการสัมภาษณ์กับผู้ใช้ระบบ รู้ว่าผู้ใช้ของคุณต้องการอะไรและถ้ามันเป็นไปไม่ได้ / ในทางปฏิบัติในการสร้าง UI / UX เพื่อให้พวกเขาทำมันผ่านทางผู้ดูแลระบบให้เพิ่มเบ็ดเหตุการณ์เพื่อให้โปรแกรมเมอร์คนอื่นสามารถทำเพื่อพวกเขาได้

การเพิ่มกิจกรรมยังเป็นวิธีที่ประหยัดในการเปิดใช้งานนักพัฒนา (ทั้งผู้ใช้ของคุณหรือแม้แต่ทีมของคุณ ) เพื่อเพิ่มฟังก์ชั่นบางอย่างลงในโค้ดที่ดูน่ากลัวซึ่งทุกคนกลัวที่จะสัมผัส วางdispatchEventสายของคุณไว้ที่กึ่งกลางของรหัสเชื่อมต่อและคุณสามารถเพิ่มฟังก์ชันการทำงานของคุณโดยไม่รบกวนรหัสในขอบเขตเดิม [บรรณาธิการ: นอกจากนี้คุณควร refactor รหัสที่น่ากลัวในบางจุด]

ประสิทธิภาพการทำงานที่ชาญฉลาดการเพิ่มกิจกรรมเพื่อจัดส่งจะขึ้นอยู่กับตำแหน่งที่คุณเพิ่ม เมื่อคุณเรียกใช้dispatchเหตุการณ์วีโอไอพีจะต้องทำการเรียก PHP เพิ่มเติมอีกสองสามครั้งสอบถามการกำหนดค่าสำหรับผู้สังเกตการณ์ที่กำหนดค่าไว้แล้วเรียกผู้สังเกตการณ์ ทำครั้งเดียวนี่คือการเพิ่มราคาถูกในขอบเขตของการจัดส่ง Magento มาตรฐาน อย่างไรก็ตามทำซ้ำหลายครั้ง (พูดก่อนแสดงทุกบล็อค) สิ่งนี้อาจเพิ่มขึ้น ไม่มีกฎง่ายๆที่ดี - เช่นเคยคำตอบที่ถูกต้องคือโปรไฟล์

ในที่สุด w / r / t Magento 2 ก็ยังเร็วเกินไปที่จะพูด ทั้งหมดข้างต้นยังคงใช้ - อย่างไรก็ตามระบบปลั๊กอินเพิ่มรอยยับเล็กน้อย ปลั๊กอินจากมุมมองหนึ่งเป็นวิธีการสร้างเหตุการณ์เช่นพฤติกรรมสำหรับการเรียกใช้วิธีสาธารณะใน Magento ในทางทฤษฎีหากคุณออกแบบชั้นเรียนของคุณอย่างถูกต้องคุณไม่จำเป็นต้องมีเหตุการณ์ อย่างไรก็ตามในทางปฏิบัติการวางเหตุการณ์ลงในรหัสวิธีการป้องกันหรือแบบส่วนตัวจะเป็นวิธีแก้ปัญหาที่น่าดึงดูดสำหรับนักพัฒนา Magento เมื่อทางเลือกนั้นเป็นกระบวนการฟื้นฟูที่ยาวนาน นอกจากนี้การสร้างเหตุการณ์ที่มีชื่อเฉพาะมักจะสามารถสร้างประสบการณ์ที่เป็นมิตรสำหรับนักพัฒนาโดยใช้โมดูลของคุณ

หวังว่าจะช่วย!


9

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

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


0

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


0

ภายใน Magento 1 คุณสามารถใช้ประโยชน์จากกิจกรรมผ่านเหตุการณ์อัตโนมัติที่เกิดขึ้น สิ่งที่คุณต้องทำคือตั้งค่า$_eventPrefixและ$_eventObjectคุณสมบัติในรุ่นของคุณ นอกจากนี้คุณยังมีเหตุการณ์คอนโทรลเลอร์คอนโทรลเลอร์แบบกำหนดเองผ่าน'controller_action_predispatch_ ' . $this->getFullActionName()และ'controller_action_postdispatch_' . $this->getFullActionName()เหตุการณ์ในคอนโทรลเลอร์โดยอัตโนมัติ สิ่งเหล่านี้สามารถทำให้คุณได้รับประโยชน์สูงสุดจากที่นั่น

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

ฉันหวังว่านี่จะช่วยได้!

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