Dostęp do pól użytkownika?

18

$account = \Drupal::currentUser()ładuje obiekt użytkownika do $account, ale jak uzyskać dostęp do niestandardowych pól, które utworzyłem w obiekcie użytkownika (poprzez interfejs użytkownika administratora)?

Dzięki dpm($account)nie widzę żadnego z moich niestandardowych pól.

24ma13wg
źródło
Czy pola niestandardowe mają jeszcze jakieś wartości? Wygląda na to, że pamiętają, jak ich nie ma w obiekcie bytu, dopóki nie ustawią wartości
Clive
Tak, mają wartości. Mogę pobrać identyfikator użytkownika, \Drupal::currentUser()->id()a następnie wykonać zapytanie do bazy danych, ale w D7 były już na obiekcie?
24ma13wg
Ten problem dotyczy nie tylko porzeczek; dotyczy ogólnie obiektu użytkownika. api.drupal.org/api/drupal/… prowadzi do połowy, ale jak to zwykle bywa w Drupal Docs, pozostawia wiele w ciemności
morze 26.2

Odpowiedzi:

29

\Drupal::currentUser()zwraca Drupal\Core\Session\AccountInterfaceobiekt. Może to być pełny użytkownik (to byłoby a Drupal\user\UserInterface), ale w tej chwili w przypadku domyślnej metody uwierzytelniania tak nie jest.

Użyj tego, aby uzyskać encję użytkownika i wszystkie pola:

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

D7 miało dokładnie to samo zachowanie, różnica polega na tym, że w D7 były to po prostu różne stdClass, teraz masz wyraźne interfejsy do ich rozróżnienia.

Berdir
źródło
Pomimo głosowania w dół, ta odpowiedź jest poprawna, nawet w przypadku Drupala 7. $GLOBALS['user']nie zawiera w pełni załadowanego obiektu użytkownika w Drupal 7; zawiera tylko informacje znalezione w tabeli użytkowników.
kiamlaluno
Tak, nie jestem pewien, dlaczego to się wzięło. To prawda, zarówno o D7, jak i D8.
mpdonadio
To tylko część odpowiedzi. W rzeczywistości nie zbliża cię do danych niż oryginalne „rozwiązanie”. Musisz „pobrać” dane z obiektu. Aby to zrobić - zobacz działające rozwiązanie opublikowane przez @batigolix poniżej.
morze26.2
Zauważ, że pola, które nie mają wartości, nie pojawią się w tablicy wartości.
JAyenGreen
16

A oto, jak wyciągnąć go z tego obiektu:

// 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
źródło
1
Otrzymasz identyfikator użytkownika za pomocą $user->id().
kiamlaluno
Ponadto encja użytkownika nie ma podstawowego pola ciała . Jeśli jest to pole dodane z interfejsu użytkownika, nazwa pola zaczyna się od field_ . Unikałbym tego przykładu, ponieważ skłania użytkowników do myślenia, że ​​jest to pole podstawowe dodane z podstawowego kodu Drupala.
kiamlaluno
1

Drupal::currentUser()zwraca obiekt implementujący Drupal\Core\Session\AccountProxyInterface. Różni się to od tego, co zostało zwrócone User::load(), czyli implementacji obiektu Drupal\user\UserInterface.

Oznacza to, że nie ma pewności, że otrzymasz pełny Userobiekt z załadowanymi polami, ale nie ma nawet pewności, że otrzymasz Userobiekt. W związku z tym wywołujesz niektóre metody dostępne w Userklasie, takie jak User::get(). Możesz zadzwonić AccountInterface::id(), który zwraca identyfikator użytkownika; dzięki temu można następnie załadować pełny Userobiekt User::load()i mieć dostęp do wszystkich modułów pól dołączonych do obiektu.

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

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

Za pomocą $accountmożesz uzyskać dostęp do wszystkich pól powiązanych z kontem użytkownika.

kiamlaluno
źródło
Być może, ale wciąż nasuwa się pytanie: „jak uzyskać dostęp do pól NIESTANDARDOWYCH”. Zobacz odpowiedź powyżej z @batigolix
sea26.2
Pytanie brzmi bardziej: Dlaczego $account = \Drupal::currentUser(): dpm($account);nie wyświetla żadnych niestandardowych pól? ale ta odpowiedź mówi, jak uzyskać dostęp do pól encji użytkownika. Ponieważ pytanie nie mówi, do których pól OP chce uzyskać dostęp, odpowiedź mówi tylko, której metody użyć. Nie ma odpowiedzi z @batigolix.
kiamlaluno
-2

Oto jednowierszowy, wykorzystujący funkcję API:

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

Następnie pola użytkowników będą dostępne.

David Thomas
źródło