Menulis ulang kelas Magento 2 vs Plugins

17

Magento 2 memiliki konsep Plugins / Interception / Interceptors yang bertentangan dengan Magento 1.
Ini bertindak seperti sebelum | setelah acara untuk setiap metode publik. Itu bagus.
Anda juga dapat menggunakan aroundplugin untuk mengganti fungsionalitas metode.
Tapi Magento 2 masih menawarkan kemungkinan menulis ulang kelas kurang lebih dengan cara M1.
Saya ingin melihat beberapa contoh di mana kelas menulis ulang adalah cara untuk pergi daripada menggunakan plugin.
Saya tahu ini berguna ketika Anda ingin mengubah perilaku metode yang dilindungi inti, tetapi apakah ada kasus lain di mana penulisan ulang direkomendasikan atau diperlukan?

Marius
sumber

Jawaban:

19

Alasan yang jelas untuk menggunakan penulisan ulang alih-alih plugin adalah ketika Anda perlu mengganti metode pribadi, dilindungi atau final .

Tetapi pertimbangkan juga skenario berikut ini.

Skenario 1 (urutan sortir absolut):

Penulisan ulang dapat bermanfaat ketika Anda membutuhkan kode Anda untuk dijalankan sebelum plugin . Saya tahu Anda bisa melakukannya dengan mengatur plugin sortOrder, tetapi Anda tidak bisa memastikan kode Anda akan selalu menjadi yang pertama ketika seseorang (bukan Anda) akan menginstal komponen pihak ke-3.

Skenario 2 (tidak termasuk kode):

Jika Anda perlu mengecualikan atau menulis ulang hanya sepotong kode dalam suatu metode, sebuah plugin bisa menjadi cara yang kurang optimal. Saya tahu Anda bisa menggunakan aroundplugin dan menghindari memanggil proceed, tetapi ini bisa merusak plugin lain di stack.

Skenario 3 (gaya kode):

Anda harus menggunakan penulisan ulang ketika Anda perlu menulis ulang suatu perilaku, plugin harus digunakan untuk memodifikasi output atau menjalankan kode sebelum / sesudah.

Sebuah plugin, harus selalu menjalankan kode asli untuk menghindari kerusakan modul lain.

Kesimpulan saya:

Jika Anda dapat mempertimbangkan metode inti sebagai kotak hitam dengan input dan satu output dan Anda agnostik tentang mekanisme internalnya, maka sebuah plugin bisa menjadi pilihan terbaik.

Jika Anda perlu mengubah perilaku internal , menulis ulang bisa menjadi pilihan terbaik.

Phoenix128_RiccardoT
sumber
Skenario 1 sedikit tidak akurat (saya pikir ini hanya kata-kata) karena plugin sebelum atau arround berjalan (atau dapat dijalankan) sebelum kode metode aktual.
David Verholen
Ya, kata-kata saya salah. Maksud saya adalah tentang urutan pengurutan relatif dengan metode aktual.
Phoenix128_RiccardoT
7

Pertanyaan yang bagus, saya bertanya pada diri sendiri hal yang sama beberapa hari yang lalu dan inilah yang saya pikirkan:

  • Pertama, plugin tidak dapat digunakan untuk metode akhir, kelas akhir dan kelas yang dibuat tanpa injeksi ketergantungan saya rasa itu adalah kasus yang sangat spesifik tapi itu adalah kasus di mana Anda tidak dapat menggunakan plugin
  • Kedua, Anda perlu mengingat definisi plugin. Ini digunakan untuk bekerja pada level metode sedangkan preferensi digunakan untuk bekerja pada level seluruh kelas. Ini tidak jelas untuk semua orang, jadi ada baiknya mengingat hal itu.
  • Akhirnya, dan saya rasa itu yang paling penting, sepertinya plugin hanya dapat digunakan untuk memperluas perilaku metode publik apa pun di dalam kelas Magento . Jadi sepertinya Anda tidak dapat menggunakan plugin dengan metode yang dilindungi / pribadi .

Sumber: Kursus Dasar Magento U

Raphael di Digital Pianism
sumber
2
Baik. Alasan bagus Saya tidak tahu harus berkata apa tentang poin kedua. Jika Anda ingin menyambungkan banyak metode publik dari kelas yang sama, saya pikir cara paling aman adalah membuat satu kelas yang bertindak sebagai plugin untuk semuanya. (pendapat saya). Saya akan membiarkan ini terbuka 2-3 hari untuk melihat apakah seseorang datang dengan alasan lain. Jika tidak .... tanda centang adalah milik Anda.
Marius
@Marius Anda benar benar: poin kedua. Untuk beberapa alasan saya pikir Anda harus membuat beberapa file plugin untuk setiap metode yang ingin Anda pluginize tapi saya pikir itulah yang dilakukan pengamat, bukan plugin. Itu akan keren jika lebih banyak orang membalas untuk melihat apakah ada lebih banyak alasan (tidak jelas).
Raphael di Digital Pianism
1
@marius sebagai tambahan: karena Plugin harus spesifik Domain, saya pikir itu harus menjadi praktik terbaik untuk hanya mendefinisikan beberapa plugin dalam satu kelas, jika mereka merupakan implementasi dari fitur yang sama. Dengan penulisan ulang, Anda tidak memiliki opsi ini karena Anda selalu mengubah seluruh kelas. Jadi saya pikir itu akan menjadi salah satu alasan untuk setidaknya mencoba menghindari penulisan ulang
David Verholen
@ DavidVerholen. Saya sangat setuju. Tapi saya meminta alasan untuk menggunakan penulisan ulang alih-alih plugin.
Marius
ya saya pikir ini bisa menjadi alasan untuk menggunakan plugin karena Anda dapat menentukan kelas-kelas plugin fitur khusus, sementara penulisan ulang hanya dapat dilakukan sekali
David Verholen