Wie erhalte ich die Benutzer-ID für den aktuell angemeldeten Benutzer?

31

Ich möchte das aktuelle Benutzerobjekt (Benutzerinformationen) in Drupal 8 erhalten.

Ich weiß, dass es in Drupal 7 eine globale $userVariable gab; Ich möchte wissen, wie ich ein aktuelles Benutzerobjekt in Drupal 8 erhalten kann.

Yusef
quelle

Antworten:

50
$user = \Drupal::currentUser();

Siehe die DrupalKlasse. 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():(


quelle
20

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;
?>
DRUPWAY
quelle
16

Der Zugriff auf Methoden in der \Drupalglobalen Klasse (wie ::currentUser()) ist im prozeduralen Code (z. B. in Ihrer mymodule.moduleDatei) 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- $currentUserObjekt getestet werden (alles, was AccountProxyInterfaceden 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:

  • Erstellen eines benutzerdefinierten Formulars: Sie müssen deklarieren, dass Sie implementieren, ContainerInjectionInterfacedamit der Container suchen kann ::create().
  • Erstellen eines Drupal-Plugins unter Verwendung der erweiterten Plugin-Architektur: Sie müssen die Implementierung deklarieren 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 .

JP
quelle