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.
$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()
:(
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;
?>
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:
ContainerInjectionInterface
pour 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épendances, mais des informations supplémentaires sur la méthode ::create()
sont disponibles sur ce blog .