Magento Event Observers: Singleton กับ Model


45

ดังนั้นวีโอไอพีจึงเสนอวิธีการประกาศผู้สังเกตการณ์ 2 วิธี Singleton and Model (ตัวอย่างใหม่) โดยการระบุ<type>แท็กใน Magento 1.x และโดยการระบุsharedแอตทริบิวต์ใน Magento 2

Magento วิธีที่ 1 ในการทำมัน

<events>
    <event_name>
        <observers>
            <unique_observer_name>
                <type>model|object|singleton|null</type>
                <class>class/alias_here</class>
                <method>methdNameHere</method>
            </unique_observer_name>
        </observers>
    </event_name>
</events>

Magento 2 เวอร์ชั่น:

<event name="event_name">
    <observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>

ดังนั้นในกรณีของวีโอไอพี 1, ถ้า<type>แท็กเป็นรูปแบบหรือวัตถุชั้นจะ instantiated Mage::getModel()กับ ถ้ามันหรือมันหายไปมันถูกสร้างโดยใช้singletonMage::getSingleton()

ในกรณีของ Magento 2 ถ้าsharedเป็นเช่นfalseนั้นคลาสจะถูกสร้างโดยใช้$this->_observerFactory->create() (ตัวอย่างใหม่)
ถ้าsharedเป็นจริงมันจะใช้อินสแตนซ์$this->_observerFactory->get()(ซิงเกิลตัน)

ระหว่างสองรุ่นความคิดเหตุการณ์สังเกตการณ์จะคล้ายกันมาก แต่ส่วนใหญ่ของผู้สังเกตการณ์ในวีโอไอพี 1 จะถูกใช้เป็น singletons เพราะtypeแท็กจะหายไปและในที่สุดวีโอไอพี 2 (ฉันคิดว่าทั้งหมด) shared="false"ของผู้สังเกตการณ์ได้

ฉันงง เมื่อใดที่ฉันควรใช้ซิงเกิลตันและฉันควรใช้อินสแตนซ์ใหม่สำหรับผู้สังเกตการณ์เมื่อใด
เวอร์ชั่นวีโอไอพี (1 หรือ 2) ไม่สำคัญที่นี่
กรณีการใช้งานที่เรียบง่ายจะทำสำหรับแต่ละวิธี (ตัวอย่างใหม่หรือซิงเกิลตัน)


ยังดิ้นรนกับมัน แม้ว่ามันจะไม่จำเป็นต้องใช้typeคุณลักษณะเลย แต่ฉันก็มักจะข้ามมันไป
Simon

@Simon ฉันมักจะข้ามมัน ไม่มีแท็กคือสิ่งเดียวกับtype <type>singleton</type>แล้วอะไรคือเหตุผลที่ทำให้เราเป็นผู้สังเกตการณ์เดี่ยว
Marius

นั่นเป็นคำถามที่ดี นั่นคือเหตุผลที่ฉัน upvote มัน แค่ต้องการชี้ให้เห็นว่าคุณสามารถข้ามไปได้ทั้งหมด
Simon

คำตอบ:


36

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

ในความเป็นจริงสิ่งนี้แทบจะไม่เกิดขึ้นเลย แต่วีโอไอพี 1 และ 2 จะใช้โดยค่าเริ่มต้น shared = true

เหตุผลที่ว่าทำไมซิงเกิลตันเป็นค่าเริ่มต้นใน magento: micro-optimization! มีคนคิดว่ามันจะช่วยประหยัดเวลาได้มากโดยไม่ต้องสร้างวัตถุซ้ำแล้วซ้ำอีก อาจเป็นจริงสำหรับบางเหตุการณ์ที่เรียกว่าไม่กี่ร้อยครั้งในระหว่างการร้องขออาจเป็นไปได้ที่จะทำตามค่าเริ่มต้นสำหรับกรณีของการใช้งานเหตุการณ์ที่ไม่ดี


5
ตะเข็บเหมือนคำอธิบายที่ดีพอ . และตอนนี้ที่คุณกล่าวถึงมันตีฉันในหัว ... กรณีที่ใช้จริงสำหรับ singletons: เมื่อคุณต้องการที่จะสังเกต_save_beforeและและการดำเนินการเกี่ยวกับการบันทึกหลังจากที่ขึ้นอยู่กับอะไรบางอย่างจาก_save_after _save_beforeดุจ! ฉันจะพลาดได้อย่างไร
Marius

"ซึ่งก็คือเหตุผลที่ magento2 ใช้โดยค่าเริ่มต้น shared = false" ผิด วีโอไอพี 2 การใช้งานshared=trueโดยค่าเริ่มต้น
Mage2.PRO


ขอบคุณปรับปรุงคำตอบ
Flyingmana

1

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

magento 2.0 ตรงไปตรงมาใช้วัตถุที่ใช้ร่วมกันเพื่อใช้ .. magento 2.0 มี destructors ที่เขียนได้ดีมากซึ่งช่วยให้ทำความสะอาดหน่วยความจำทันทีที่เสร็จงาน!

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