Auf Benutzerfelder zugreifen?

18

$account = \Drupal::currentUser()lädt das Benutzerobjekt in $account, aber wie greife ich auf benutzerdefinierte Felder zu, die ich auf dem Benutzerobjekt erstellt habe (über die Benutzeroberfläche des Administrators)?

Mit dpm($account)kann ich keines meiner benutzerdefinierten Felder sehen.

24ma13wg
quelle
Haben die benutzerdefinierten Felder noch Werte? Scheint sich zu erinnern, dass sie im Entitätsobjekt fehlen, bis tatsächlich ein Wert festgelegt wurde
Clive
Ja, sie haben Werte. Ich kann die UID mit bekommen \Drupal::currentUser()->id()und dann eine Datenbankabfrage machen, aber in D7 waren sie schon auf dem Objekt?
24ma13wg
Dieses Problem betrifft nicht nur den aktuellen Benutzer. es bezieht sich allgemein auf das Benutzerobjekt. api.drupal.org/api/drupal/… bringt Sie auf halbem Weg dorthin, aber wie es normalerweise bei Drupal Docs der Fall ist, bleibt vieles im Dunkeln
26.

Antworten:

29

\Drupal::currentUser()Gibt ein Drupal\Core\Session\AccountInterfaceObjekt zurück. Das könnte ein Vollbenutzer sein (das wäre ein Drupal\user\UserInterface), aber im Moment ist dies für die Standardauthentifizierungsmethode nicht der Fall .

Verwenden Sie diese Option, um die Benutzerentität und alle Felder abzurufen:

$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())

D7 hatte genau das gleiche Verhalten, der Unterschied ist nur, dass es sich in D7 einfach um verschiedene stdClass'es handelte. Jetzt haben Sie explizite Schnittstellen, um die beiden zu unterscheiden.

Berdir
quelle
Trotz der Abwärtsabstimmung ist diese Antwort auch bei Drupal 7 korrekt. In Drupal 7 $GLOBALS['user']ist kein vollständig geladenes Benutzerobjekt enthalten. Es enthält nur die Informationen, die in der Benutzertabelle enthalten sind.
Kiamlaluno
Ja, ich bin mir nicht sicher, warum das eine schlechte Bewertung ist. Es ist richtig, sowohl bei D7 als auch bei D8.
mpdonadio
Dies ist nur ein Teil der Antwort. Und tatsächlich kommen Sie den Daten nicht näher als mit der ursprünglichen "Lösung". Sie müssen die Daten aus dem Objekt "holen". Lesen Sie dazu die von @batigolix unten bereitgestellte Arbeitslösung.
sea26.2
Beachten Sie, dass Felder ohne Werte nicht im Wertearray angezeigt werden.
JAyenGreen
16

Und hier ist, wie man es aus diesem Objekt herausholt:

// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

// Get field data from that user.
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;

// Some default getters include.
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;
Darryn
quelle
1
Sie erhalten die Benutzerkennung mit $user->id().
kiamlaluno
Die Benutzerentität verfügt auch nicht über ein Body- Base-Feld. Wenn dies ein Feld ist, das von der Benutzeroberfläche hinzugefügt wurde, würde der Feldname mit field_ beginnen . Ich würde dieses Beispiel vermeiden, da es die Benutzer glauben lässt, dass es sich um ein Basisfeld handelt, das aus dem Drupal-Kerncode hinzugefügt wurde.
kiamlaluno
1

Drupal::currentUser()Gibt ein implementierendes Objekt zurück Drupal\Core\Session\AccountProxyInterface. Das ist etwas anderes als das, was von zurückgegeben wurde User::load(), einem Objekt, das implementiert Drupal\user\UserInterface.

Dies bedeutet, dass Sie nicht sicher sind, dass Sie ein vollständiges UserObjekt mit geladenen Feldern erhalten, aber es ist nicht einmal sicher, dass Sie ein UserObjekt erhalten. Als Konsequenz rufen Sie einige der in der UserKlasse verfügbaren Methoden auf, z User::get(). Sie können anrufen AccountInterface::id(), wodurch die Benutzer-ID zurückgegeben wird. Damit können Sie dann das gesamte UserObjekt mit User::load()allen an die Entität angehängten Feldmodulen laden und haben Zugriff darauf.

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;

$account = User::load(\Drupal::currentUser()->id());

Mit $accountkönnen Sie dann auf alle mit einem Benutzerkonto verknüpften Felder zugreifen.

kiamlaluno
quelle
Vielleicht, aber es wirft immer noch die Frage auf: "Wie greifen Sie auf die CUSTOM-Felder zu?". Siehe Antwort oben von @batigolix
sea26.2
Die Frage ist mehr Warum werden $account = \Drupal::currentUser(): dpm($account);keine benutzerdefinierten Felder angezeigt? Diese Antwort gibt jedoch an, wie auf Benutzerentitätsfelder zugegriffen werden soll. Da die Frage nicht sagt, auf welche Felder das OP zugreifen möchte, sagt die Antwort nur, welche Methode verwendet werden soll. Es gibt keine Antworten von @batigolix.
kiamlaluno
-2

Hier ist ein Einzeiler mit der API-Funktion:

$account = \Drupal::currentUser()->getAccount();

Danach sind die Benutzerfelder zugänglich.

David Thomas
quelle