Réponses:
$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():(
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 \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:
ContainerInjectionInterfaceafin 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 .