web-dev-qa-db-fra.com

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

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

Je sais que dans Drupal 7 il y avait une variable globale $user; Je veux savoir comment obtenir l'objet utilisateur actuel dans Drupal 8.

31
Yusef
$user = \Drupal::currentUser();

Voir la classe Drupal. 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 directement \Drupal::service().

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 méthode directe comme \Drupal::currentUser()->getEntity() :(

52
user21641

Exemple de comment charger l'utilisateur actuel et récupérer les données de champ à partir 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;
?>
21
DRUPWAY

L'accès aux méthodes sur la classe globale \Drupal (Comme ::currentUser()) est OK dans le code procédural (par exemple dans votre fichier mymodule.module) Mais dans votre propre OO code, vous devriez essayer d'accéder au service @current_user, 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 objet factice $currentUser (Tout ce qui implémente AccountProxyInterface, et 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 la nature réelle de l'objet 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 les do docs .

[modifier] Une modification suggérée de cette réponse (qui a été rejetée par les modérateurs) a introduit 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 n'est pas utilisée par les services que vous enregistrez via le mymodule.services.yml D'un module: pour ceux-ci, le conteneur appelle directement le constructeur. Il n'est utile que pour l'injection dans des classes hors service; par exemple:

  • créer un formulaire personnalisé: vous devez déclarer que vous implémentez ContainerInjectionInterface pour que le conteneur sache rechercher ::create().
  • créer un Drupal Plugin, en utilisant l'architecture 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épendances, mais des informations supplémentaires sur la méthode ::create() sont disponibles sur ce blog .

17
J-P