Kapan mengirimkan acara dalam modul khusus?

14

Ini adalah pertanyaan tentang Magento 1 dan Magento 2.

Saya memahami bahwa, sebagai praktik yang baik, pengembang modul pihak ketiga didorong untuk mengirimkan acara dalam modul khusus mereka untuk membuatnya lebih mudah untuk bekerja dengan modul lain.

Saya ingin tahu:

  • di mana pengembang harus mengirim acara dalam modul khusus?
  • Adakah tempat yang direkomendasikan untuk mengirim acara? Misalnya Pengontrol, model, balok, pembantu, pengamat?
  • bagaimana pengiriman acara memengaruhi kinerja?
Raphael di Digital Pianism
sumber
Iya! Pertanyaan bagus. siapapun tolong jawab pertanyaan ini. Ini akan sangat membantu untuk pengembang ekstensi pihak ketiga serta untuk proyek kustom.
mapaladiya

Jawaban:

10

Anda tidak akan menemukan jawaban yang baik, jelas, dan deterministik di sini. Pada umumnya, Anda harus mengirimkan acara dalam modul tempat Anda dan pengguna Anda membutuhkannya - jika Anda tidak dapat memikirkan di mana pun mereka mungkin dibutuhkan, Anda tidak perlu mengirimkannya. Magento sendiri memancarkan begitu banyak peristiwa di begitu banyak tempat yang berbeda (pengiriman pre / post controller, operasi crud, dll) sehingga modul Anda sudah akan mengirimkan sejumlah peristiwa berguna tanpa Anda melakukan apa pun.

Karena itu tidak memuaskan, Anda ingin modul Anda mengirimkan acara ketika ada beberapa tindakan yang dilakukan modul Anda sehingga pengguna Anda mungkin ingin menambahkan item, menghapus item dari, mengubah, atau mengambil tindakan terpisah terlepas dari tindakan asli. Misalnya - Magento memiliki visitor_initacara yang bukan bagian dari rangkaian standar acara yang dibuat secara otomatis. Acara ini memungkinkan programmer untuk memodifikasi objek pengunjung sebelum data log Magento. Ini tidak mungkin pengembang modul asli untuk mengetahui secara deterministikini adalah tempat acara perlu ditambahkan - kemungkinan berasal dari permintaan fitur dan / atau wawancara dengan pengguna sistem. Ketahui apa yang diinginkan pengguna Anda, dan jika tidak mungkin / praktis untuk membangun UI / UX agar mereka melakukannya melalui admin, tambahkan pengait acara sehingga programmer lain dapat melakukannya untuk mereka.

Kurang seksi, menambahkan acara juga bisa menjadi cara murah untuk memungkinkan pengembang (baik pengguna Anda, atau bahkan tim Anda ) untuk menambahkan beberapa fungsionalitas ke dalam sedikit kode yang sulit disentuh semua orang. Taruh dispatchEventpanggilan Anda di tengah kode, kaitkan ke dalamnya, dan Anda dapat menambahkan fungsionalitas Anda tanpa mengganggu kode di ruang lingkup aslinya. [Editor: Anda juga harus memperbaiki kode mengerikan itu di beberapa titik]

Dari segi kinerja, menambahkan acara untuk dikirim akan bergantung pada tempat Anda menambahkannya. Saat Anda memanggil dispatchacara, Magento perlu membuat beberapa panggilan PHP tambahan, menanyakan konfigurasi untuk setiap pengamat yang dikonfigurasi, dan kemudian memanggil pengamat. Dilakukan sekali, ini adalah tambahan murah dalam lingkup pengiriman Magento standar. Namun, dilakukan berulang kali, (katakanlah, sebelum setiap blok render) ini dapat bertambah. Tidak ada aturan praktis yang baik di sini - karena selalu jawaban yang tepat adalah profil.

Akhirnya, dengan Magento 2, masih terlalu dini untuk mengatakan. Semua hal di atas masih berlaku - namun sistem plugin menambahkan beberapa kerutan. Plugin, dari satu sudut pandang, merupakan cara untuk membuat perilaku seperti acara untuk panggilan metode publik apa pun di Magento. Secara teori, jika Anda merancang kelas dengan benar, Anda seharusnya tidak perlu acara. Namun, dalam praktiknya, memasukkan acara ke sedikit kode metode yang dilindungi atau pribadi akan menjadi solusi yang menggoda bagi pengembang Magento ketika alternatifnya adalah proses refactoring yang panjang. Selain itu, membuat acara yang diberi nama khusus sering kali dapat menciptakan pengalaman yang lebih ramah bagi para pengembang menggunakan modul Anda.

Semoga itu bisa membantu!

Alan Storm
sumber
9

Untuk Magento 1, saat-saat yang baik untuk melempar acara adalah sebelum dan sesudah semua operasi CRUD dan sebelum dan sesudah rendering. Banyak dari ini sudah disediakan oleh kelas abstrak di inti, sehingga dalam praktiknya tidak banyak acara pihak ketiga diperlukan.

Dengan Magento 2 situasinya berbeda. Karena panggilan metode publik dapat disadap dengan plugin, acara khusus tidak lagi diperlukan.
Saat mendesain kelas, alih-alih hanya membuat setiap metode publik sehingga dapat dicegat, lebih baik untuk menguraikan kelas besar menjadi beberapa kelas yang lebih kecil.
Masing-masing kelas yang lebih kecil mungkin memiliki satu atau dua metode publik yang dinamai dengan baik dan dapat disadap.

Vinai
sumber
0

Seperti kata Vinai, sebelum / sesudah operasi CRUD. Tempat penting lainnya untuk mengirim acara adalah di blok formulir adminhtml (jika ada). Dengan begitu Anda bisa menambahkan bidang input baru jika Anda telah menambahkan atribut / bidang khusus tanpa harus menulis ulang blok formulir admin. (Ini untuk Magento 1). Lihat contoh

Erfan
sumber
0

Di dalam Magento 1, Anda dapat memanfaatkan peristiwa melalui peristiwa yang dipecat secara otomatis yang terjadi. Yang perlu Anda lakukan adalah mengatur $_eventPrefixdan $_eventObjectproperti pada model Anda. Juga, Anda memiliki peristiwa kontroler dipecat kustom melalui 'controller_action_predispatch_ ' . $this->getFullActionName()dan 'controller_action_postdispatch_' . $this->getFullActionName()acara di controller secara otomatis. Itu bisa membuat Anda jauh dari sana.

Untuk Magento 2, jaga agar metode Anda publik di dalam kelas Anda. Ini memungkinkan plugin untuk mencegat metode Anda. Jika Anda mengikuti ini, Anda tidak perlu membuat acara khusus.

Saya harap ini membantu!

Ryan Street
sumber