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.


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.


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;

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.