Je veux obtenir l'objet utilisateur actuel (informations utilisateur) dans Drupal 8.
Je sais que dans Drupal 7, il y avait une $user
variable globale ; Je veux savoir comment obtenir un objet utilisateur actuel dans Drupal 8.
$user = \Drupal::currentUser();
Voir la Drupal
classe. 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()
:(
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;
?>
L'accès aux méthodes sur la \Drupal
classe globale (comme ::currentUser()
) est OK dans le code procédural (par exemple dans votre mymodule.module
fichier) mais dans votre propre code OO, vous devriez essayer d'accéder au @current_user
service, 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 $currentUser
objet factice (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 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:
ContainerInjectionInterface
afin que le conteneur sache rechercher ::create()
.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 .