Функція, яку ви можете використовувати, це user_uid_optional_load () ; без аргументів він повертає об’єкт користувача для поточно зареєстрованого користувача. Він все ще використовує глобальний $user
і завантажує повний об’єкт із бази даних, включаючи поля, пов’язані з користувачами, але це дозволяє уникнути, щоб ваш код випадково змінив вміст глобальної змінної $user
, оскільки на неї не посилається ваш код.
function user_uid_optional_load($uid = NULL) {
if (!isset($uid)) {
$uid = $GLOBALS['user']->uid;
}
return user_load($uid);
}
Якщо вам не потрібен повний об'єкт, ви можете використовувати код, про який вже повідомлялося в інших відповідях. Якщо ви хочете бути впевнені, що ви не змінюєте глобальний об'єкт, ви можете скопіювати глобальну змінну в локальну змінну, як у наведеному нижче фрагменті.
$account = $GLOBALS['user'];
// Use $account.
У Drupal 8 ви просто використовуєте статичний метод, \Drupal::currentUser()
щоб отримати еквівалент Drupal 7 $GLOBALS['user']
і \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())
отримати повністю завантажений об'єкт з усіма його полями API API. Більше не існує ризику перекриття глобальної змінної з усіма наслідками.
У випадку, якщо вам потрібно переключити поточного користувача, наприклад, з анонімним користувачем, код, який ви використовуєте в Drupal 8, є наступним.
$accountSwitcher = Drupal::service('account_switcher');
$accountSwitcher->switchTo(new Drupal\Core\Session\AnonymousUserSession());
// Your code here.
// Eventually, restore the user account.
$accountSwitcher->switchBack();