Ich möchte das aktuelle Benutzerobjekt (Benutzerinformationen) in Drupal 8 erhalten.
Ich weiß, dass es in Drupal 7 eine globale $user
Variable gab; Ich möchte wissen, wie ich ein aktuelles Benutzerobjekt in Drupal 8 erhalten kann.
$user = \Drupal::currentUser();
Siehe die Drupal
Klasse. Es gibt viele Hilfsmethoden; Bei den meisten handelt es sich um Verknüpfungen für Dienste, sodass Sie nicht \Drupal::service()
direkt anrufen müssen .
Beachten Sie, dass der aktuelle Benutzer nicht die Benutzerentität ist, sondern nur der Benutzer-Proxy. Sie können einige grundlegende Informationen daraus abrufen, aber Felder oder andere entitätsspezifische Logik sind nicht vorhanden. Um auf die Benutzerentität zuzugreifen, müssen Sie sie manuell laden:
$user = User::load(\Drupal::currentUser()->id());
Leider gibt es keine direkte Methode wie \Drupal::currentUser()->getEntity()
:(
Beispiel zum Laden des aktuellen Benutzers und Abrufen von Felddaten vom Benutzerobjekt.
<?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;
?>
Der Zugriff auf Methoden in der \Drupal
globalen Klasse (wie ::currentUser()
) ist im prozeduralen Code (z. B. in Ihrer mymodule.module
Datei) in Ordnung, aber in Ihrem eigenen OO-Code sollten Sie versuchen @current_user
, über ein Standardmuster namens Dependency Injection (DI) auf den Service zuzugreifen :
<?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();
/* ... */
}
}
Mit diesem Muster kann Ihr Code vollständig isoliert mit einem Dummy- $currentUser
Objekt getestet werden (alles, was AccountProxyInterface
den Wartungsaufwand implementiert und erheblich reduzieren kann).
DI ist jedoch nicht sehr intuitiv und braucht eine Weile, um es zu verstehen. Wie Sie den Dienst in Ihren Objektkonstruktor einbinden, hängt davon ab, wie sich das Objekt in Drupal tatsächlich befindet. Plugins verhalten sich beispielsweise anders als registrierte Dienste. Weitere Informationen zu DI in Drupal 8 finden Sie in der Dokumentation .
[edit] Eine vorgeschlagene Änderung dieser Antwort (die von den Moderatoren abgelehnt wurde) public static function create()
, die ohne weitere Erklärung in den Code eingefügt wurde. Es wäre jedoch irreführend, diese Klassenmethode ohne weitere Diskussion hinzuzufügen.
Zu Referenzzwecken sieht die Funktion create () folgendermaßen aus:
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_user')
);
}
Die Klassenmethode wird nicht von irgendwelchen Diensten verwendet man über eine Modul registrieren mymodule.services.yml
: für diese, ruft der Container der Konstruktor direkt. Es ist immer nur zum Injizieren in Nicht-Service-Klassen nützlich. beispielsweise:
ContainerInjectionInterface
damit der Container suchen kann ::create()
.ContainerFactoryPluginInterface
, für die eine andere Methodensignatur erforderlich ist ::create()
.Dies ist nicht der Ort, um die Abhängigkeitsinjektion zu stark zu erweitern, aber weitere Informationen zu dieser ::create()
Methode finden Sie in diesem Blogpost .