Maison > développement back-end > tutoriel php > Nouvel attribut Drupal Hook

Nouvel attribut Drupal Hook

Linda Hamilton
Libérer: 2024-12-30 01:01:10
original
175 Les gens l'ont consulté

New Drupal Hook attribute

Dans l'annonce de la nouvelle version, quelque chose a attiré mon attention. D'après le titre, vous savez qu'il s'agit de l'attribut Hook.
Pour les personnes qui ne connaissent pas les attributs php, j'ai écrit un article à ce sujet il y a quelque temps.

La façon dont vous deviez ajouter des hooks était une horreur pour moi depuis que Drupal 8 est passé à une manière de structurer le code orientée objet.
Utiliser le nom du module pour préfixer les fonctions et utiliser le fichier .module pour ajouter toutes les fonctions me faisait penser à un code très spaghetti.

Et maintenant, ils l'ont presque réparé. Presque parce qu’il y a un tas de crochets qui sont encore procéduraux. Le plan est de supprimer les hooks procéduraux dans Drupal 12, donc dans les prochaines versions mineures de Drupal, nous verrons ces hooks disparaître.

Quels sont les avantages ?

Au lieu d'ajouter des fonctions au fichier .module, les hooks se trouvent dans le répertoire src du module.
Je suggère d'utiliser un sous-répertoire Hooks pour une identification plus facile. Ou ajoutez le suffixe Hooks au nom de la classe.

Parce qu'il s'agit d'un attribut, vous pouvez lier plusieurs hooks à la même méthode.

// 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
  }
}
Copier après la connexion
Copier après la connexion

Pour les personnes qui maintiennent des modules pour les versions Drupal antérieures à 11.1, il existe un attribut supplémentaire, LegacyHook. Cela vous permet de déplacer le code du hook vers la classe avec l'attribut hook. Et les anciennes versions de Drupal exécuteront la fonction dans le fichier .module, mais les versions plus récentes n'exécuteront que la méthode de classe.

// module.module
#[LegacyHook]
function module_comment_insert(CommentInterface $comment) {
   new CommentHooks()->commentInsertOrUpdate($comment);
}

#[LegacyHook]
function module_comment_update(CommentInterface $comment) {
   new CommentHooks()->commentInsertOrUpdate($comment);
}
Copier après la connexion

Comment utiliser l'attribut Hook

Comme vous pouvez le voir dans les exemples de code précédents, l'attribut est ajouté à la méthode.

Mais vous pouvez également ajouter la méthode à la classe.

#[Hook('comment_insert')]
#[Hook('comment_update')]
class CommentManipulationHook {
  public function __invoke(CommentInterface $comment) {
    // do something
  }
}
Copier après la connexion

Comme je le montre dans l'exemple, je suggère de rendre le nom de la classe plus descriptif. Et utilisez le suffixe Hook au lieu de Hooks.

Vous pouvez ajouter les attributs Hook à la classe et ajouter la méthode comme deuxième paramètre. Je ne le recommande pas, dans ce cas, il est plus propre d'ajouter l'attribut à la méthode.

Il existe un troisième paramètre Hook, module. Et cela vous permet d'exécuter une classe hook à partir d'un autre module. Par exemple #hook('comment_insert', 'commentInsert', 'my_comment_module').
J'ai réfléchi à un cas d'utilisation pour cela, mais je n'en ai trouvé aucun.
Si vous en connaissez un, faites-le-moi savoir.

Conclusion

J'aime voir le code Drupal évoluer dans la bonne direction.

La seule chose qui m'a dérangé, c'est que les crochets sont des constantes magiques. Mais le plan est de regrouper tous les attributs hooks avec comme classe de base l'attribut Hook. Donc au lieu de #[Hook('comment_insert')] ce sera #[CommentInsert].
Une autre façon de le faire est d'utiliser des énumérations, regroupées par module.

// 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
  }
}
Copier après la connexion
Copier après la connexion

Les informations contenues dans cet article sont basées sur la documentation et l'aperçu rapide que j'ai eu de l'implémentation. Lorsque j'aurai testé la fonctionnalité, il y aura des mises à jour à publier ou une publication supplémentaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal