Dans cet article de blog, nous allons explorer comment implémenter un hook en utilisant cette nouvelle approche basée sur les attributs, en nous concentrant spécifiquement sur la modification d’un formulaire d’article de type nœud (node_article_form) dans Drupal 11.1. Nous passerons en revue les étapes et fournirons un exemple de code d’implémentation.
Introduction
À partir de Drupal 11.1, une nouvelle méthode d’implémentation des hooks a été introduite, permettant aux développeurs d’utiliser les principes de la programmation orientée objet (POO). Contrairement à l’approche procédurale traditionnelle, cette nouvelle méthode permet de définir les hooks sous forme de méthodes au sein de classes, rendant ainsi le code plus organisé et plus facile à gérer.
Dans les versions précédentes de Drupal, les hooks étaient implémentés sous forme de fonctions procédurales, avec des noms de fonction suivant un modèle spécifique. Cela pouvait rendre le code difficile à maintenir dans les projets de grande envergure. Avec Drupal 11.1, les hooks peuvent désormais être implémentés sous forme de méthodes dans une classe, et ces méthodes sont enregistrées à l’aide de l’attribut #[Hook].
Supposons que nous souhaitions personnaliser le node_article_form en ajoutant des éléments personnalisés ou en modifiant ceux existants. Voici comment vous pouvez l’implémenter en utilisant la nouvelle approche.
Créez une classe PHP dans le répertoire src/Hook de votre module :
<?php
declare(strict_types=1);
namespace Drupal\mymodule\Hook;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Hook\Attribute\Hook;
/**
* Hook implementations for the node module.
*/
class FormHooks {
/**
* Implements hook_form_alter().
*
* Customizes the node article form.
*/
#[Hook('form_alter')]
public function articleFormAlter(array &$form, FormStateInterface $form_state, $form_id) {
if ($form_id == 'node_article_form') {
// Add a custom message to the node article form.
$form['custom_message'] = [
'#type' => 'markup',
'#markup' => '<p>This is a custom message added via a form alter hook.</p>',
];
// Example of changing a field's default value.
if (isset($form['title']['widget'][0]['value'])) {
$form['title']['widget'][0]['value']['#default_value'] = 'Default Article Title';
}
}
}
}Étape 2 : Assurez-vous que votre classe est correctement structurée
Assurez-vous que votre classe se trouve dans le bon espace de noms et suit les conventions de nommage. Drupal 11.1 enregistrera automatiquement cette classe en tant que service, il n’est donc pas nécessaire de la définir manuellement dans un fichier .services.yml.
Dans l'exemple ci-dessus :
- #[Hook('form_alter')] : Cet attribut indique à Drupal que la méthode articleFormAlter doit être exécutée chaque fois que le hook form_alter est déclenché.
- Paramètres de la méthode : Les paramètres ($form, $form_state, $form_id) sont les mêmes que ceux utilisés dans les hooks procéduraux, ce qui facilite la transition de votre code vers la nouvelle méthode.
- Logique de modification du formulaire : Vous pouvez ajouter, supprimer ou modifier des éléments de formulaire comme vous le feriez dans un hook procédural.
Avantages de la nouvelle approche
- POO et autowiring : L'utilisation de classes facilite l'organisation et la gestion de vos implémentations de hooks. Vous pouvez injecter des services dans vos classes, ce qui rend votre code plus propre et plus facile à maintenir.
Plusieurs hooks dans une seule classe : Vous pouvez implémenter plusieurs hooks au sein d'une même classe. Par exemple, si vous souhaitez gérer à la fois hook_entity_insert et hook_entity_update pour les nœuds, vous pouvez faire :
#[Hook('entity_insert')] #[Hook('entity_update')] public function handleEntityInsertOrUpdate(EntityInterface $entity) { if ($entity->getEntityTypeId() === 'node') { // Handle both insert and update operations for nodes. } }Cet exemple montre comment vous pouvez centraliser la logique pour des hooks similaires, réduisant ainsi la duplication de code et améliorant la maintenabilité.
- Gestion des services simplifiée : Les classes sont automatiquement enregistrées en tant que services, qui peuvent être modifiés à l'aide de classes de fournisseur de services. Cela élimine le besoin d'enregistrement manuel des services et rend le processus plus fluide.
Conclusion
Le nouveau système de hooks basé sur les attributs dans Drupal 11.1 apporte plusieurs avantages, notamment une meilleure organisation du code, une gestion des services optimisée et une facilité de maintenance. La migration vers ce nouveau système est simple, en particulier pour les développeurs déjà familiers avec les hooks procéduraux. Cette approche modernise la gestion des hooks, ouvrant la voie à des améliorations futures et rendant le développement Drupal plus cohérent.
En suivant les étapes de ce guide, vous pouvez commencer à convertir vos anciens hooks procéduraux vers le nouveau système basé sur les classes et tirer parti de la structure et de la flexibilité améliorées offertes par Drupal 11.1.