Dalam pengumuman versi baharu sesuatu telah menarik perhatian saya. Daripada tajuk anda tahu ia adalah atribut Hook.
Bagi orang yang tidak biasa dengan atribut php, saya telah menulis siaran mengenainya sebentar tadi.
Cara yang anda perlukan untuk menambah cangkuk adalah menyusahkan saya memandangkan Drupal 8 beralih kepada cara berorientasikan objek untuk menstrukturkan kod.
Menggunakan nama modul untuk awalan fungsi dan menggunakan fail .module untuk menambah semua fungsi mempunyai rasa kod spageti yang sangat baik untuk saya.
Dan kini mereka hampir membetulkannya. Hampir kerana terdapat sekumpulan mata kail yang masih prosedural. Rancangannya adalah untuk mengeluarkan cangkuk prosedur dalam Drupal 12, jadi dalam versi Drupal kecil seterusnya kita akan melihat cangkuk itu hilang.
Daripada menambah fungsi pada fail .module, cangkuk berada dalam direktori src modul.
Saya cadangkan untuk menggunakan subdirektori Hooks untuk pengenalan yang lebih mudah. Atau tambahkan akhiran Cangkuk pada nama kelas.
Oleh kerana ia adalah atribut, anda boleh mengikat berbilang cangkuk pada kaedah yang sama.
// module.module function module_comment_insert(CommentInterface $comment) { module_comment_manipulation($comment); } function module_comment_update(CommentInterface $comment) { module_comment_manipulation($comment); } function module_comment_manipulation(CommentInterface $comment) { // do something } // with Hook attribute class CommentHooks { #[Hook('comment_insert')] #[Hook('comment_update')] public function commentInsertOrUpdate(CommentInterface $comment) { // do something } }
Bagi mereka yang mengekalkan modul untuk versi Drupal sebelum 11.1 terdapat atribut tambahan, LegacyHook. Ini membolehkan anda mengalihkan kod cangkuk ke kelas dengan atribut cangkuk. Dan versi lama Drupal akan melaksanakan fungsi dalam fail .module, tetapi versi yang lebih baharu hanya akan melaksanakan kaedah kelas.
// module.module #[LegacyHook] function module_comment_insert(CommentInterface $comment) { new CommentHooks()->commentInsertOrUpdate($comment); } #[LegacyHook] function module_comment_update(CommentInterface $comment) { new CommentHooks()->commentInsertOrUpdate($comment); }
Seperti yang anda lihat daripada contoh kod sebelumnya, atribut ditambahkan pada kaedah.
Tetapi anda juga boleh menambah kaedah pada kelas.
#[Hook('comment_insert')] #[Hook('comment_update')] class CommentManipulationHook { public function __invoke(CommentInterface $comment) { // do something } }
Seperti yang saya tunjukkan dalam contoh, saya cadangkan untuk menjadikan nama kelas lebih deskriptif. Dan gunakan akhiran Hook dan bukannya Hooks.
Anda boleh menambah atribut Hook pada kelas dan menambah kaedah sebagai parameter kedua. Saya tidak mengesyorkan ini, Dalam kes itu adalah lebih bersih untuk menambah atribut pada kaedah.
Terdapat parameter Hook ketiga, modul. Dan ini membolehkan anda melaksanakan kelas cangkuk dari modul lain. Contohnya #hook('comment_insert', 'commentInsert', 'my_comment_module').
Saya telah memikirkan tentang kes penggunaan untuk ini, tetapi saya tidak dapat menemuinya.
Jika anda tahu satu, beritahu saya.
Saya suka melihat kod Drupal bergerak ke arah yang betul.
Satu perkara yang mengganggu saya ialah mata kail adalah pemalar ajaib. Tetapi rancangannya adalah untuk semua atribut cangkuk dengan sebagai kelas asas atribut Hook. Jadi bukannya #[Hook('comment_insert')] ia akan menjadi #[CommentInsert].
Satu lagi cara yang boleh mereka lakukan ialah dengan menggunakan enum, dikumpulkan mengikut modul.
// module.module function module_comment_insert(CommentInterface $comment) { module_comment_manipulation($comment); } function module_comment_update(CommentInterface $comment) { module_comment_manipulation($comment); } function module_comment_manipulation(CommentInterface $comment) { // do something } // with Hook attribute class CommentHooks { #[Hook('comment_insert')] #[Hook('comment_update')] public function commentInsertOrUpdate(CommentInterface $comment) { // do something } }
Maklumat dalam siaran ini adalah berdasarkan dokumentasi dan pandangan pantas saya terhadap pelaksanaannya. Apabila saya telah menguji ciri tersebut akan ada kemas kini untuk disiarkan atau siaran tambahan.
Atas ialah kandungan terperinci Atribut Drupal Hook baharu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!