Доступ до полів користувача?


18

$account = \Drupal::currentUser()завантажує об’єкт користувача у $account, але як я можу отримати доступ до власних полів, які я створив на об’єкті користувача (через інтерфейс адміністратора)?

Оскільки dpm($account)я не бачу жодного зі своїх спеціальних полів.


Чи мають ще власні поля якісь значення? Здається, пам’ятайте, що вони відсутні в об’єкті сутності, поки вони фактично не встановлять значення
Clive

Так, вони мають значення. Я можу отримати uid з, \Drupal::currentUser()->id()а потім зробити запит до бази даних, але в D7 вони вже були там на об'єкті?
24ma13wg

Ця проблема стосується не лише користувача смородини; він, як правило, відноситься до об'єкта користувача. api.drupal.org/api/drupal/… приводить вас на півдорозі, але як це зазвичай буває з Drupal Docs, він залишає багато ще в темряві
море26.2

Відповіді:


29

\Drupal::currentUser()повертає Drupal\Core\Session\AccountInterfaceоб’єкт. Це може бути повний користувач (це було б Drupal\user\UserInterface), але зараз для методу аутентифікації за замовчуванням це не так.

Використовуйте це, щоб отримати сутність користувача та всі поля:

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

D7 мав абсолютно таку ж поведінку, відмінність зараз полягає лише в тому, що в D7 вони були просто різними stdClass'es, тепер у вас є явні інтерфейси для диференціації двох.


Незважаючи на рейтинг голосів, ця відповідь є правильною, навіть щодо Drupal 7. $GLOBALS['user']не містить повного завантаженого користувацького об’єкта, в Drupal 7; він містить лише інформацію, знайдену в таблиці користувачів.
kiamlaluno

Так, не впевнений, чому це призвело до протидії. Це правильно, як щодо D7, так і для D8.
mpdonadio

Це лише частина відповіді. І насправді це не дає вам ближче до даних, ніж оригінальне "рішення". Ви повинні "отримати" дані від об'єкта. Для цього - див. Робоче рішення, розміщене @batigolix нижче.
море26.2

Зауважте, що поля, у яких немає значень, не відображатимуться в масиві значень.
JAyenGreen

16

А ось як вийти з цього об’єкта:

// 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
Ви отримуєте ідентифікатор користувача за допомогою $user->id().
kiamlaluno

Також у суті Користувача немає базового поля тіла . Якщо це поле, додане з інтерфейсу користувача, ім'я поля починається з field_ . Я б уникну цього прикладу, оскільки змушує користувачів думати, що базове поле додається з основного коду Drupal.
kiamlaluno

1

Drupal::currentUser()повертає об'єкт, що реалізує Drupal\Core\Session\AccountProxyInterface. Це відрізняється від того, що повернуто з User::load(), що є об'єктом реалізації Drupal\user\UserInterface.

Це означає, що ви не впевнені, що отримаєте повний Userоб’єкт із завантаженими полями, але навіть не впевнені, що отримаєте Userоб’єкт. Як наслідок, ви викликаєте виклик деяких методів, доступних у Userкласі, таких як User::get(). Ви можете зателефонувати AccountInterface::id(), що повертає ідентифікатор користувача; з цим ви можете потім завантажити повний Userоб'єкт User::load()і мати доступ до всіх модулів полів, приєднаних до сутності.

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

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

Після цього $accountви можете отримати доступ до всіх полів, пов’язаних із обліковим записом користувача.


Можливо, але все-таки виникає запитання: "як ви отримуєте доступ до МИТНИХ полів". Дивіться відповідь вище від @batigolix
sea26.2

Питання більше Чому $account = \Drupal::currentUser(): dpm($account);не відображаються спеціальні поля? але ця відповідь говорить про те, як отримати доступ до полів сутності користувача. Оскільки в запитанні не сказано, до яких полів ОП намагається отримати доступ, відповідь просто говорить, який метод використовувати. Немає відповідей від @batigolix.
kiamlaluno

-2

Ось один лайнер, використовуючи функцію API:

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

Після цього поля користувачів будуть доступні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.