Jadi Magento menawarkan 2 cara untuk menyatakan pengamat. Singleton dan Model (contoh baru) dengan menentukan <type>
tag di Magento 1.x dan dengan menentukan shared
atribut 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 singleton
atau tidak ada, itu dipakai menggunakan Mage::getSingleton()
.
Dalam kasus Magento 2, jika shared
ini false
maka kelas instantiated menggunakan $this->_observerFactory->create()
(misalnya baru).
jika shared
benar 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 type
tag 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)
type
atribut sama sekali, sehingga saya biasanya melewatkannya sekarang.type
tag yang sama dengan<type>singleton</type>
. Jadi apa alasan kita membuat pengamat lajang?Jawaban:
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.
sumber
_save_before
dan_save_after
dan tindakan menyelamatkan setelah bergantung pada sesuatu dari_save_before
. Duh! bagaimana saya bisa melewatkannya?shared=true
secara default .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!
sumber