Pengamat Peristiwa Magento: Singleton versus Model

45

Jadi Magento menawarkan 2 cara untuk menyatakan pengamat. Singleton dan Model (contoh baru) dengan menentukan <type>tag di Magento 1.x dan dengan menentukan sharedatribut di Magento 2.

Cara Magento 1 melakukannya.

<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>

Versi Magento 2:

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

Jadi dalam kasus Magento 1, jika <type>tag adalah model atau objek, kelas akan dipakai dengan Mage::getModel(). Jika ada singletonatau tidak ada, itu dipakai menggunakan Mage::getSingleton().

Dalam kasus Magento 2, jika sharedini falsemaka kelas instantiated menggunakan $this->_observerFactory->create() (misalnya baru).
jika sharedbenar itu dipakai menggunakan $this->_observerFactory->get()(tunggal).

Di antara dua versi, gagasan pengamat acara sangat mirip, tetapi sebagian besar pengamat di Magento 1 digunakan sebagai lajang, karena typetag tersebut hilang dan di Magento 2 sebagian besar (saya pikir semua) dari pengamat memilikinya shared="false".

Saya bingung. Kapan saya harus menggunakan lajang dan kapan saya harus menggunakan contoh baru untuk pengamat?
Versi Magento (1 atau 2) tidak penting di sini.
Kasus penggunaan sederhana akan dilakukan untuk setiap pendekatan (contoh baru atau tunggal)

Marius
sumber
Juga berjuang dengan itu. Meskipun tidak perlu menggunakan typeatribut sama sekali, sehingga saya biasanya melewatkannya sekarang.
Simon
@Simon Saya biasanya melewatkannya. Tidak ada typetag yang sama dengan <type>singleton</type>. Jadi apa alasan kita membuat pengamat lajang?
Marius
Itu memang pertanyaan yang bagus. Itu sebabnya saya membatalkannya. Hanya ingin menunjukkan bahwa Anda juga dapat melewatkannya sama sekali.
Simon

Jawaban:

36

Hanya ada satu usecase, di mana tunggal untuk pengamat masuk akal. Itulah saat Anda mengamati dua peristiwa yang saling bergantung dan Anda ingin mendapatkan sesuatu selama yang pertama, tetapi memprosesnya selama acara kedua. Anda juga dapat menggunakan registri di sini, tetapi itu akan menjadi sesuatu yang lebih global, jadi variabel tunggal dan kelas terproteksi adalah solusi yang baik.

Pada kenyataannya ini hampir tidak pernah terjadi, tetapi magento 1 dan 2 digunakan secara default shared = true

Mungkin alasan mengapa singleton default di magento: optimasi mikro! Seseorang berpikir itu akan menghemat banyak waktu untuk tidak perlu membuat objek lagi dan lagi. Mungkin benar untuk beberapa peristiwa yang disebut beberapa ratus kali selama permintaan, mungkin bahkan masuk akal untuk melakukannya sebagai standar untuk kasus-kasus penggunaan acara yang buruk.

Flyingmana
sumber
5
Jahitannya seperti penjelasan yang cukup bagus. . Dan sekarang setelah Anda menyebutkannya, itu menghantam kepala saya ... kasus penggunaan nyata untuk lajang: ketika Anda ingin mengamati _save_beforedan _save_afterdan tindakan menyelamatkan setelah bergantung pada sesuatu dari _save_before. Duh! bagaimana saya bisa melewatkannya?
Marius
"Yaitu, mengapa Magento2 menggunakan secara default shared = false" Ini salah. Magento 2 menggunakan shared=truesecara default .
Mage2.PRO
thx, memperbarui jawabannya
Flyingmana
1

Magento secara default menggunakan singleton sehingga menghemat sumber daya di dalam kotak. dua model proses operasi bersamaan kebutuhan karena mereka perlu menyimpan dan menyimpan data secara individual. di singleton objek menjadi volatil segera setelah data baru dimuat.

Magento 2.0 dimuka menggunakan objek bersama untuk memanfaatkan .. magento 2.0 memiliki destruktor yang ditulis dengan sangat baik yang membuat pembersihan memori segera setelah pekerjaan selesai!

Vipul Dadhich -TyLabs
sumber