Drupal 8 : Charger et lister des entités avec EntityQuery

Cet article est extrait de notre formation drupal 8 "de Drupal 7 à Drupal 8" à destination des développeurs. N'hésitez pas à nous contacter pour en savoir plus !

Durant l’ère de Drupal 6, l’utilisation massive de CCK a poussé les développeurs à vouloir transposer beaucoup de concepts Drupal en nœuds. On a voulu que les blocs, les utilisateurs, la taxonomie puissent être enrichis par des champs à l’aide d’une seule API.

Cela a donné naissance au système d’entités de Drupal 7 et au “tout entité”. Bien que certains éléments n’aient pas subi ce changement (pauvre bloc) sous Drupal 7, cette démarche a été poussée à l’extrême dans Drupal 8 et encore plus de composants sont gérés par une API unifiée et deviennent des entités.

Lister des entités

Drupal 8 introduit, en s’inspirant de EntityFieldQuery, un Service de requêtage d’entités entity.query via la classe \Drupal\Core\Entity\Query\QueryFactory.
Une fois une instance récupérée, il est possible de chaîner les conditions pour former une requête :

$fids = \Drupal::entityQuery('file')
  ->condition('status', FILE_STATUS_PERMANENT, '<>')
  ->condition('changed', REQUEST_TIME - $age, '<')
  ->range(0, 100)
  ->execute();

Charger des entités

Une classe de gestion des entités a été créée dans Drupal 8, il s’agit de la classe \Drupal\Core\Entity\EntityTypeManager. Elle donne accès à plusieurs outils pour charger, lister, ou afficher des entités. La méthode getStorage() donne ainsi accès à une classe de gestion de stockage des entités qui implémente EntityStorageInterface. Les méthodes load() ou loadMultiple() quant à elles remplacent entity_load() de Drupal 7.

$entitytype_manager = \Drupal::service('entity_type.manager');
$storage = $entitytype_manager->getStorage('file');
$files = $storage->loadMultiple($fids);

Afficher des entités

L’affichage d’un contenu qui pouvait se faire grâce à entity_view() en Drupal 7 passe aussi par la classe \Drupal\Core\Entity\EntityTypeManager et les classes se basant sur l’interface EntityViewBuilderInterface. Il faut utiliser la méthode getViewBuilder() pour récupérer une instance de la classe et les méthodes view() et viewMultiple() pour en faire le rendu.

$view_builder = $entitytype_manager->getViewBuilder('file');
$output = $view_builder->viewMultiple($nodes, $view_mode);

Votre commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
Votre adresse servira à afficher un Gravatar et à vous notifier des réponses. Votre commentaire sera anonymisé si ce billet est dépublié pendant plus de 3 mois.

À propos de Julien

Gérant - 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.

Nous rejoindre ?

Vous avez envie de rejoindre une équipe éthique ?
Vous avez envie de faire un partenariat ?