Rumah > pembangunan bahagian belakang > tutorial php > Atribut Drupal Hook baharu

Atribut Drupal Hook baharu

Linda Hamilton
Lepaskan: 2024-12-30 01:01:10
asal
175 orang telah melayarinya

New Drupal Hook attribute

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.

Apakah faedahnya?

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
  }
}
Salin selepas log masuk
Salin selepas log masuk

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);
}
Salin selepas log masuk

Cara menggunakan atribut Hook

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
  }
}
Salin selepas log masuk

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.

Kesimpulan

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
  }
}
Salin selepas log masuk
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan