Fil d'Ariane
Drupal 8 : Naviguer dans le code et comprendre les implémentations Drupal
Comprendre comment le code est découpé dans un projet et où intervenir.
Cet article a été initialement rédigé pour Drupal 8.
N'hésitez pas à nous contacter ou à vous inscrire à notre formation «Drupal pour les développeurs et développeuses» pour en savoir plus !
Le plus gros challenge lorsque l’on passe d’une version majeure de Drupal à une autre est de retrouver ses repères. Qui plus est lorsqu’on les a cachés. La montée de version amène avec elle de nouveaux paradigmes qu’il faut s’approprier. Nous les avons parcourus ensemble pour que vous appreniez à les différencier et à comprendre leur fonctionnement.
Lorsque vous implémenterez une fonctionnalité, les deux questions qui vous viendront à l’esprit seront “quel modèle (pattern) dois-je implémenter ?” et “où dois-je implémenter ce modèle (pattern) ?” souvent suivies par “comment puis-je implémenter ce modèle (pattern) ?”. Avec D7 la réponse était dans la plupart des cas “il suffit d’implémenter un hook” et les fichiers d’API suffisaient comme documentation. Dans D8, les hooks ne sont plus légions et la documentation ne se trouve plus uniquement dans les fichiers d’API.
Votre expérience Drupal 8 consistera à principalement vous approprier les services existants et les types de plugins à votre disposition pour arriver à vos fins. La documentation de ces éléments se trouvera soit dans les fichiers d’API, dans la documentation des interfaces qu’implémentent les classes ou dans les classes déclarant les plugins.
Les grands types d’implémentation
Identifier un contrôleur de page
Vous cherchez à modifier un comportement sur le rendu d’une page. Le premier réflexe à adopter consiste à identifier la route qui déclare cette page. Une recherche dans les fichiers *.routing.yml sur l’attribut path
devrait vous donner des informations sur le contrôleur utilisé pour rendre la page. À vous, à partir de ce point, de dé-construire le rendu de la page pour surcharger la partie qui convient.
Surcharger un Service
Une action que vous ferez probablement régulièrement sera la surcharge de Services. Faute de hook_alter()
, le remplacement de Service vous permettra d’ajouter le comportement spécifique dont vous avez besoin de façon chirurgical. Pour trouver votre Service, une recherche se fera cette fois sur les fichiers *.services.yml. Il faudra souvent aller voir la classe qui implémente le service voire l’interface qu’elle implémente pour trouver les arguments à lui fournir et leur rôle.
Implémenter une annotation
C’est le cas lorsque vous voulez définir un plugin (pour créer un bloc, un formateur de champ.) Pour trouver les informations à fournir à l’annotation, jetez un œil à la classe définissant l’annotation. Exemple d’un bloc pour lequel la classe associée est Block/Annotation/Block
:
# Plugin/Block/CustomBlock.php
/**
* Declare a block.
*
* @Block(
* id = "custom_block",
* admin_label = @Translation("Custom block"),
* )
*/
Surcharger une entité de contenu
Si vous voulez modifier le contrôle d’accès ou le rendu d’un type d’entité de contenu, allez voir sa déclaration, vous y trouverez les handlers responsable de chacune de ces fonctionnalités au sein de l’annotation @ContentEntityType
. Il est ensuite possible de les modifier via le hook_entity_type_alter()
.
Le découpage en classes
On pourra facilement reprocher à Drupal 8 son nombre élevé de classes mais c’est le prix à payer pour avoir une POO propre. La segmentation permet la réutilisation et le découplage fonctionnel. On veillera à utiliser une classe pour gérer la réponse à une requête (classe de contrôleur) où on préparera des données, après que le contrôle d’accès ait été fait par une autre classe avant de déléguer le rendu à une autre classe. Chacun son travail !
Votre commentaire
À propos de Julien
Co-fondateur - Scrum master & Expert technique
Utilisateur de Drupal depuis 2008, j’ai fait mes armes comme développeur chez Commerce Guys puis me suis mis à encadrer les nouveaux arrivants avant de donner des formations, participer aux avant ventes et accompagner les équipes au passage à Scrum.
Je suis impliqué dans la communauté française de Drupal depuis 2009, j’ai été tour à tour président puis vice-président de l’association Drupal France et francophonie entre 2011 et 2013.