Magento 2: Plugin vs Observer


27

Di Magento 2, apa pro dan kontra menggunakan plugin vs pengamat untuk mencapai sesuatu?

Saya mengerti bahwa pengamat berlangganan acara sedangkan plugin dapat melompat sebelum dan / atau setelah metode publik dipanggil pada kelas Magento, tapi pasti mereka sudah dekat dengan persimpangan sekarang?


pengamat akan sangat terbatas tetapi plugin Anda melakukan perubahan untuk semua fungsi publik
Pradeep Kumar

Jawaban:


42

Plugin ada di mana-mana karena dimungkinkan untuk mengubah / mengganti perilaku metode publik apa pun dalam sistem. Kustomisasi harus dilakukan menggunakan plugin untuk metode / kelas publik yang ditandai dengan @apianotasi (stable public API) bila memungkinkan. Pendekatan semacam itu menjamin bahwa kustomisasi akan tetap berfungsi setelah rilis Magento baru. Selain before/ afterplugin yang disebutkan dalam pertanyaan, dimungkinkan untuk membuat aroundplugin untuk menggantikan perilaku asli.

Di sisi lain, pengamat adalah mekanisme perpanjangan warisan yang diwarisi dari Magento 1, sangat terbatas dan harus dihindari jika memungkinkan. Namun, tidak seperti plugin, mereka dapat memberikan titik ekstensi di dalam metode yang dilindungi / pribadi.


Juga lihat jawaban berbicara tentang preferensi vs plugin / pengamat: magento.stackexchange.com/a/94035/697 , semoga bermanfaat.
Alex Paliarush

@alex: - cara menulis plugin untuk fungsi yang dilindungi, sebagian besar kasus kita perlu mengganti fungsi yang dilindungi dalam situasi itu bagaimana melakukannya? magento.stackexchange.com/questions/91353/…
Pradeep Kumar

Plugin @PradeepKumar dapat ditambahkan ke metode publik saja. Pertanyaan yang Anda sebutkan memiliki jawaban, tetapi solusi yang diajukan diblokir tetapi masalah yang diketahui (plugin tidak dapat diterapkan ke tipe virtual). Sebagai solusi sementara Anda dapat mendeklarasikan plugin untuk kelas kerangka URL dan di sana menambahkan logika kondisional berdasarkan argumen (sehingga plugin melakukan sesuatu pada kasus Anda saja)
Alex Paliarush

i jut memberi satu contoh, ada banyak fungsi dalam dilindungi dalam hal bagaimana menimpa, cara apa pun di sana untuk mengesampingkan fungsi yang dilindungi
Pradeep Kumar

@PradeepKumar jika Anda perlu mengganti metode yang dilindungi, Anda mungkin perlu memperluas kelas dan menggunakan preferensi / penulisan ulang. Bagaimanapun, sarankan Anda mengajukan pertanyaan alih-alih dalam komentar ini
Robbie Averill

1

Menurut panduan teknis Magento ( https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events ): Semua nilai (termasuk objek) diteruskan ke acara yang TIDAK HARUS dimodifikasi dalam pengamat acara. Sebagai gantinya, plugins HARUS digunakan untuk memodifikasi input atau output dari suatu fungsi.

Bagi saya perbedaan utama antara plugin dan pengamat adalah:

  1. Plugin hanya dapat memodifikasi metode publik sementara pengamat dapat memodifikasi pribadi, terlindungi juga.
  2. Ada pengurutan untuk plugin tetapi tidak ada pengurutan untuk pengamat.
  3. Anda dapat menambahkan pengamat hanya ke acara yang sudah dikirim di Magento. Plugin lebih fleksibel di sini.

Saya juga dapat memperbarui pesanan dengan pengamat, bukan?
Robbie Averill

@RobbieAverill ya, Anda dapat membuat pengamat untuk checkout_submit_all_afteracara. Pengamat Anda akan dipicu setelah pesanan berhasil dilakukan.
transversus

Apakah itu berarti bahwa "mereka tidak mengubah data" tidak benar dalam kasus itu?
Robbie Averill

1
Ya, Anda benar @RobbieAverill. Baik plugin maupun pengamat dapat memodifikasi data. Bagi saya perbedaan utama antara plugin dan pengamat adalah: 1. Plugin hanya dapat memodifikasi metode publik sementara pengamat dapat memodifikasi pribadi, dilindungi juga. 2. Ada pengurutan untuk plugin tetapi tidak ada pengurutan untuk pengamat. 3. Anda dapat menambahkan pengamat hanya ke acara yang sudah dikirim di Magento. Plugin lebih fleksibel di sini.
transversus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.