$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.
\Drupal::currentUser()->id()
a następnie wykonać zapytanie do bazy danych, ale w D7 były już na obiekcie?Odpowiedzi:
\Drupal::currentUser()
zwracaDrupal\Core\Session\AccountInterface
obiekt. Może to być pełny użytkownik (to byłoby aDrupal\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:
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.
źródło
$GLOBALS['user']
nie zawiera w pełni załadowanego obiektu użytkownika w Drupal 7; zawiera tylko informacje znalezione w tabeli użytkowników.A oto, jak wyciągnąć go z tego obiektu:
źródło
$user->id()
.Drupal::currentUser()
zwraca obiekt implementującyDrupal\Core\Session\AccountProxyInterface
. Różni się to od tego, co zostało zwróconeUser::load()
, czyli implementacji obiektuDrupal\user\UserInterface
.Oznacza to, że nie ma pewności, że otrzymasz pełny
User
obiekt z załadowanymi polami, ale nie ma nawet pewności, że otrzymaszUser
obiekt. W związku z tym wywołujesz niektóre metody dostępne wUser
klasie, takie jakUser::get()
. Możesz zadzwonićAccountInterface::id()
, który zwraca identyfikator użytkownika; dzięki temu można następnie załadować pełnyUser
obiektUser::load()
i mieć dostęp do wszystkich modułów pól dołączonych do obiektu.Za pomocą
$account
możesz uzyskać dostęp do wszystkich pól powiązanych z kontem użytkownika.źródło
$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.Oto jednowierszowy, wykorzystujący funkcję API:
Następnie pola użytkowników będą dostępne.
źródło