Comment obtenir l'ID utilisateur de l'utilisateur actuellement connecté?

31

Je veux obtenir l'objet utilisateur actuel (informations utilisateur) dans Drupal 8.

Je sais que dans Drupal 7, il y avait une $uservariable globale ; Je veux savoir comment obtenir un objet utilisateur actuel dans Drupal 8.

Yusef
la source

Réponses:

50
$user = \Drupal::currentUser();

Voir la Drupalclasse. Il existe de nombreuses méthodes d'assistance; la plupart d'entre eux sont des raccourcis pour les services, vous n'avez donc pas à appeler \Drupal::service()directement.

Notez que l'utilisateur actuel n'est pas l'entité utilisateur, c'est juste un proxy utilisateur. Vous pouvez en obtenir des informations de base mais les champs ou toute autre logique spécifique à l'entité ne sont pas présents. Pour accéder à l'entité utilisateur, vous devez la charger manuellement:

$user = User::load(\Drupal::currentUser()->id());

Malheureusement, il n'y a pas de méthode directe comme \Drupal::currentUser()->getEntity():(


la source
20

Exemple de chargement de l'utilisateur actuel et de récupération des données de champ de l'objet utilisateur.

<?php
// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

// retrieve field data from that user
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;


$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;
?>
DRUPWAY
la source
16

L'accès aux méthodes sur la \Drupalclasse globale (comme ::currentUser()) est OK dans le code procédural (par exemple dans votre mymodule.modulefichier) mais dans votre propre code OO, vous devriez essayer d'accéder au @current_userservice, via un modèle standard appelé injection de dépendance (DI):

<?php

namespace Drupal\mymodule;

use Drupal\Core\Session\AccountProxyInterface;

class MyClass {
  /**
   * @var AccountProxy
   */
  protected $currentUser;

  public function __construct(AccountProxyInterface $currentUser) {
    $this->currentUser = $currentUser;
  };

  public function doSomething() {
    $currentUserId = $this->currentUser->id();
    /* ... */
  }
}

Ce modèle permet à votre code d'être testé dans une isolation complète, avec un $currentUserobjet factice (tout ce qui implémente AccountProxyInterfaceet peut réduire considérablement les frais généraux de maintenance.

Cependant, DI n'est pas très intuitif et prend du temps à comprendre. La façon dont vous obtenez le service dans votre constructeur d'objet dépend de ce que l'objet est réellement dans Drupal, par exemple les plugins se comportent différemment des services enregistrés. Il y a plus d'informations sur DI dans Drupal 8 dans la documentation .

[modifier] Une modification suggérée de cette réponse (qui a été rejetée par les modérateurs) introduite public static function create()dans le code, sans autre explication. Cependant, il serait trompeur d'ajouter cette méthode de classe sans autre discussion.

Pour référence, voici à quoi ressemblerait la fonction create ():

  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('current_user')
    );
  }

La méthode de classe est pas utilisé par tous les services que vous inscrire via ce module mymodule.services.yml: pour ceux - ci, le conteneur appelle le constructeur directement. Il n'est utile que pour l'injection dans des classes hors service; par exemple:

  • créer un formulaire personnalisé: vous devez déclarer votre implémentation ContainerInjectionInterfaceafin que le conteneur sache rechercher ::create().
  • créer un plugin Drupal, en utilisant l'architecture de plugin plus large: vous devez déclarer que vous implémentez ContainerFactoryPluginInterface, ce qui nécessite une signature de méthode différente pour ::create().

Ce n'est pas le lieu d'étendre trop sur l'injection de dépendance, mais de plus amples informations sur la ::create()méthode sont disponibles sur ce blogpost .

JP
la source