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.
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 } }
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); }
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 } }
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.
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 } }
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!