Я всегда шел с этим global $user;
. Тем не менее, я помню, что видел что-то в добавленном модуле, который возвращал текущий пользовательский объект без использования global $user
.
Существует ли такая функция в ядре Drupal 7, или де-факто рекомендует использовать глобальную переменную для получения текущего объекта пользователя?
Ответы:
Функцией, которую вы можете использовать, является user_uid_optional_load () ; без аргументов возвращает объект пользователя для текущего пользователя, вошедшего в систему. Он по-прежнему использует глобальный
$user
объект и загружает полный объект из базы данных, включая поля, связанные с пользователями, но он предотвращает случайное изменение вашего кода содержимым глобальной переменной$user
, поскольку на него нет ссылок из вашего кода.Если вам не нужен полный объект, тогда вы можете использовать код, уже сообщенный в других ответах. Если вы хотите быть уверены, что не изменили глобальный объект, вы можете скопировать глобальную переменную в локальную переменную, как показано в следующем фрагменте.
В Drupal 8 вы просто используете статический метод,
\Drupal::currentUser()
чтобы получить эквивалент Drupal 7$GLOBALS['user']
и\Drupal\user\Entity\User::load(\Drupal::currentUser()->id())
получить полностью загруженный объект со всеми его полями API полей. Больше нет риска переопределения глобальной переменной со всеми вытекающими последствиями.В случае, если вам нужно переключить текущего пользователя, например, с анонимным пользователем, код, который вы используете в Drupal 8, следующий.
источник
$user
Объект объявлен как глобальная переменная, так что если вы хотите получить к нему доступ вам нужно использовать либо:или
На самом деле, в Drupal не существует стандартного способа сделать это. Если вы посмотрите на модуль узла, например,
node_access_grants()
функция использует этот код:Тогда как следующая функция в файле
node_access_view_all_nodes()
использует это:Простой ответ заключается в том, что оба действительны. Я думаю, что использование
$GLOBALS
так, что именованная переменная$user
не активна в текущей области и поэтому не может быть перезаписана небрежным вызовом, например,$user = NULL
далее в функции. Я не на все 100%, хотя.источник
global $user;
обычно используется, когда переменная упоминается более одного раза, и$GLOBALS['user']
должна использоваться, когда она используется только один раз в коде функции; Код Drupal не является постоянным в этом. Существует случай, когдаglobal $user;
это необходимо: когда пользовательский объект передаетсяdrupal_alter()
для разрешения сторонним модулям изменять текущего активного пользователя (что на самом деле не реализовано в Drupal).global $user
это не то же самое, что user_uid_optional_load (). Первый загружается из сеанса и не является полностью загруженным пользовательским объектом (с вызываемыми полями и хуками), а второй -. Так что я бы не стал перечислять это как вариант. Назначение этой функции - использовать ее для именованных аргументов меню, которые могут по желанию принимать идентификатор пользователя и в противном случае использовать его по умолчанию для текущего пользователя. / user / uid является основным примером.global $user
он не был полностью загружен по умолчанию (хотя это имеет смысл и объясняет пару вещей, о которых я задумывался раньше). Я взял это из ответа.Это так же просто, как объявить (существующий) глобальный объект $ user в пределах вашей функции:
Имейте в виду, что изменения, внесенные в этот объект, влияют на него глобально, т.е.
только что дал текущему пользователю uid 1 привилегии. Вот почему, как правило, $ user назначается на $ account, чтобы данные можно было обрабатывать, фактически не затрагивая вошедшего в систему пользователя (если, конечно, вы этого не хотели).
источник