Manipuler les entités
Introduction
Au cœur de Drupal se trouve le concept d’entités, que nous avons abordé dans les chapitres précédents. Les entités sont les briques fondamentales sur lesquelles repose la création de contenu et la structure de données dans Drupal, englobant tout : des utilisateurs et des nœuds (nodes) de contenu aux termes de taxonomie et aux fichiers.
Les entités dans Drupal ne sont pas juste des conteneurs de données ; elles sont définies et structurées avec précision à travers des champs, des types et des bundles, permettant une grande modularité. Chaque entité possède des champs qui définissent son information et sa structure de données. Comprendre la configuration de ces champs, leurs types, leurs restrictions et leur stockage est essentiel pour manipuler les entités de manière efficace et pertinente.
La spécificité de chaque type d’entités ainsi que leurs objectifs jouent un rôle crucial dans la manière dont elles sont manipulées et interagissent au sein de l’écosystème Drupal. Par exemple, les entités de type Node sont utilisées pour gérer le contenu, tandis que les entités de type User gèrent les informations des utilisateurs. Chaque type d’entité vient avec ses propres spécificités...
Chargement des entités
Drupal fournit plusieurs méthodes pour charger des entités, chacune avec ses propres cas d’usage et avantages.
Chaque fois que vous aurez besoin de charger une entité, vous le ferez par le biais de son identifiant (ID). Par convention, on note généralement certains ID très courants à Drupal de cette manière :
-
nid pour les ID des nodes ;
-
tid pour les ID des termes de taxonomie ;
-
uid pour les ID des utilisateurs ;
-
vid pour les ID des versions de révision des entités.
Pour tous les autres types d’entités, on utilisera une notation plus classique du type entity_id, par exemple : project_id, product_id, view_id, etc.
1. Entity::load vs EntityTypeManager::load
La méthode Entity::load() est souvent utilisée pour sa simplicité lorsqu’on souhaite charger une seule entité par son identifiant (ID).
Par exemple, Node::load($nid) permet de charger un nœud spécifique par son ID.
use Drupal\node\Entity\Node;
$node = Node::load($nid);
Pour charger plusieurs entités simultanément, Drupal offre Entity::loadMultiple(), qui prend un tableau d’ID en paramètre et retourne un tableau d’entités.
use Drupal\node\Entity\Node;
$nodes = Node::loadMultiple([$nid1, $nid2]);
Cependant, pour une flexibilité accrue, notamment lorsqu’on travaille avec des types d’entités variés ou lorsqu’on a besoin de paramètres de chargement spécifiques, on utilise \Drupal::entityTypeManager()->getStorage(’node’)->load() et sa variante loadMultiple().
$node = \Drupal::entityTypeManager()->getStorage('node')
->load($nid);
$nodes = \Drupal::entityTypeManager()->getStorage('node')
->loadMultiple([$nid1, $nid2]);
Ces méthodes offrent un accès plus direct au système de stockage des entités, permettant des opérations plus complexes comme la « variabilisation » du type d’entité lors du chargement. Cela signifie...
Opérations sur les entités
Manipuler les entités dans Drupal, que ce soit pour les créer, les modifier ou les supprimer, nécessite une compréhension profonde de la structure des entités ainsi que des méthodes disponibles pour interagir avec elles. Cela inclut la création, la modification et la suppression d’entités, soit directement via les classes d’entités, soit en utilisant le service entityTypeManager.
1. Création d’entités
Pour créer une nouvelle entité, vous pouvez instancier directement un objet d’entité ou utiliser le service entityTypeManager.
Voici comment vous pourriez créer un node de type article :
use Drupal\node\Entity\Node;
$node = Node::create([
'type' => 'article',
'title' => 'Article title',
'body' => [
'summary' => 'Article summary',
'value' => 'Article full content',
'format' => 'full_html',
],
// Multi-valued field.
'field_authors' => [
['value' => 'Author 1'],
['value' => 'Author 2'], ...
Requêtes avec EntityQuery
Dans Drupal, les EntityQuery offrent une interface puissante et flexible pour interroger des entités de tout type (utilisateurs, nodes, termes de taxonomie, etc.) et sont conçues pour fonctionner de manière optimale avec le système d’entités de Drupal, garantissant la compatibilité et la sécurité des accès.
Les EntityQuery permettent d’interroger des entités selon leurs propriétés ou leurs champs, offrant une solution optimale pour des requêtes avancées sans la complexité des jointures SQL. Elles sont intégrées à Drupal pour fournir une couche d’abstraction qui simplifie l’accès aux données en respectant les contrôles d’accès et la structure interne de Drupal.
Bien qu’il soit possible d’effectuer des requêtes SQL directes avec \Drupal::database()->query(), il est recommandé d’utiliser EntityQuery autant que possible. Les EntityQuery sont plus sécurisées, car elles intègrent automatiquement les contrôles d’accès et sont conçues pour fonctionner naturellement avec les structures d’entités de Drupal, réduisant ainsi les risques d’erreurs et les vulnérabilités de sécurité.
1. Requêtes simples
Les requêtes simples avec EntityQuery permettent de filtrer et de récupérer des ensembles d’entités en fonction de critères spécifiques, comme le type d’entité, le bundle, ou encore les valeurs de champs particuliers. Ces requêtes sont particulièrement puissantes pour extraire des données de manière efficace et sécurisée dans Drupal.
Dans Drupal, presque tout est une entité, permettant ainsi de faire des requêtes sur :
-
les nœuds (nodes) ;
-
les blocs (blocks) ;
-
les utilisateurs (users) ;
-
les entités personnalisées ;
-
et bien plus...
La création et l’exécution d’une requête EntityQuery peuvent être considérées comme deux étapes distinctes. Dans la phase de création, vous définissez le type d’entité cible et chaînez vos critères de sélection.
Ceci est possible...
Affichage des entités
L’affichage des entités dans Drupal est souvent réalisé à travers le module Views. Cependant, il existe des situations où l’utilisation d’un contrôleur personnalisé peut offrir des avantages significatifs par rapport à Views.
Voici quelques cas où la création d’un contrôleur personnalisé peut être pertinente :
-
Performance : pour des affichages très spécifiques, un contrôleur personnalisé peut être plus léger et plus rapide que Views, surtout si le besoin est simple et ne justifie pas l’utilisation de Views.
-
Contrôle complet : un contrôleur offre un contrôle total sur le processus de récupération et d’affichage des données, permettant d’optimiser les requêtes, de personnaliser le rendu et d’intégrer des logiques métier complexes.
-
Cas spécifiques : le contrôleur peut servir pour des fonctionnalités qui ne sont pas facilement réalisables via Views, comme des affichages conditionnels avancés, des interactions utilisateurs personnalisées ou l’intégration de logiques métier particulières.
1. Préparation du contrôleur
Pour démontrer l’utilisation d’un contrôleur personnalisé dans Drupal pour l’affichage des entités, commencez par créer un contrôleur qui récupère et affiche les dix derniers articles publiés. Ce contrôleur utilisera une EntityQuery pour effectuer la récupération des entités et la fonction dpm() pour afficher les résultats de manière préliminaire.
Pour ce faire, prenez la commande drush generate controller que vous avez eu l’occasion d’utiliser dans le chapitre Création de modules personnalisés.
Voici les spécificités de votre nouveau contrôleur :
-
module : my_module
-
classe : LatestArticlesController
-
nom de la route : my_module.latest_articles
-
chemin de la route : /latest-articles

Reconstruisez le cache Drupal à l’aide de la commande drush cr puis accédez à la page /latest-articles.

Modifiez la méthode __invoke() du contrôleur afin...