Charger des entités depuis un contrôleur dans Drupal

Drupal 8

Charger des entités depuis un contrôleur dans Drupal

Soumis par Antoine le ven 20/03/2020 - 16:50

Pour charger une entité, on utilise une "storage instance" à partir du service entityTypeManager. Pour utiliser ce service, il y a deux méthodes. La simple consiste à l'appeler à l'aide du code :

\Drupal::entityTypeManager()->getStorage('id_type_entité')

Il est donc primordial de connaitre les identifiants des différents types d'entités. Pour cela, il est possible d'utiliser la commande drush suivante :

drush eval "print_r(array_keys(\Drupal::entityTypeManager()->getDefinitions()));"

L'autre solution, plus complexe, consiste à faire une injection de dépendance. Pour simplifier les exemples, nous allons utiliser la première méthode.

Pour charger des entités les méthodes les plus utiles sont :

Load()

Cette méthode permet de charger une entité à partir de son identifiant

    // Using the storage controller (recommended).
    $entity_type='node';
    $entity = \Drupal::entityTypeManager()->getStorage($entity_type)->load(1);
    return [
      '#theme' => 'nom_defini_dans_nommodule.module',
      '#livres' => $entity,
    ];

loadMultiple(array)

Cette méthode permet de récupérer un tableau d'entité à partir d'un tableau d'identifiant

// Load multiple entities, also exists as entity_load_multiple().
	$entity_type='node';    
$entities = \Drupal::entityTypeManager()->getStorage($entity_type)->loadMultiple([1, 2, 3]);
    return [
      '#theme' => 'nom_defini_dans_nommodule.module',
      '#livres' => $entities,
    ];

loadByProperties(['propriété 1'=>'valeur 1', 'propriété 2'=>'valeur 2'])

Cette méthode permet de récupérer un tableau d’entités à partir d’un tableau de couple propriété/valeur. L'exemple suivant permet de charger les noeuds qui sont activés, qui sont du type livre et dont l'auteur est le numéro 3

// Load entities by their property values.
    $entities = \Drupal::entityTypeManager()
        ->getStorage('node')
        ->loadByProperties([
          'status' => '1',
          'type' => 'livre',
          'field_ecrivain' => 3,
        ]);
    return [
      '#theme' => 'nom_defini_dans_nommodule.module',
      '#livres' => $entities,
    ];

Si vous souhaitez faire une recherche sur un champ, vous devez utiliser son nom machine (exemple field_ecrivain)

Version