Как получить идентификатор пользователя для текущего пользователя?

Я хочу получить текущий пользовательский объект (информацию о пользователе) в Drupal 8.

Я знаю, что в Drupal 7 была глобальная переменная $ user ; Я хочу знать, как я могу получить текущий пользовательский объект в Drupal 8.

26 голосов | спросил zhilevan 20 SunEurope/Moscow2015-12-20T14:11:46+03:00Europe/Moscow12bEurope/MoscowSun, 20 Dec 2015 14:11:46 +0300 2015, 14:11:46

4 ответа


40
  $ user = \ Drupal :: currentUser ();
 

См. класс Drupal . Существует много вспомогательных методов; большинство из них - ярлыки для служб, поэтому вам не нужно напрямую обращаться к \ Drupal :: service () .

Обратите внимание, что текущий пользователь не является сущностью пользователя, это просто пользовательский прокси. Вы можете получить от него основную информацию, но полей или другой логики сущности не существует. Чтобы получить доступ к пользовательскому объекту, вам необходимо загрузить его вручную:

  $ user = Пользователь :: load (\ Drupal :: currentUser () -> id ());
 

К сожалению нет прямого метода, такого как \ Drupal :: currentUser () - gt; getEntity () : (

ответил Ivan Jaros 20 SunEurope/Moscow2015-12-20T15:56:04+03:00Europe/Moscow12bEurope/MoscowSun, 20 Dec 2015 15:56:04 +0300 2015, 15:56:04
18

Пример того, как загружать текущего пользователя и извлекать данные поля из пользовательского объекта.

  & л;? PHP
//Загрузите текущего пользователя.
$ user = \ Drupal \ user \ Entity \ User :: load (\ Drupal :: currentUser () -> id ());

//получать данные поля от этого пользователя
$ website = $ user-> get ('field_website') -> value;
$ body = $ user-> get ('body') -> value;


$ email = $ user-> get ('mail') -> value;
$ name = $ user-> get ('name') -> value;
$ uid = $ user-> get ('uid') -> значение;
? & GT;
 
ответил Smalution 21 MonEurope/Moscow2015-12-21T10:08:17+03:00Europe/Moscow12bEurope/MoscowMon, 21 Dec 2015 10:08:17 +0300 2015, 10:08:17
7

Доступ к методам глобального класса \ Drupal (например, :: currentUser () ) в процедурном коде (например, в вашем mymodule.module ), но в вашем собственном OO-коде вы должны попытаться получить доступ к службе @current_user , используя стандартный шаблон, называемый инъекцией зависимостей (DI):

  & л;? PHP

пространство имен Drupal \ mymodule;

используйте Drupal \ Core \ Session \ AccountProxyInterface;

класс MyClass {
  /**
   * @var AccountProxy
   * /
  protected $ currentUser;

  public function __construct (AccountProxyInterface $ currentUser) {
    $ this-> currentUser = $ currentUser;
  };

  public function doSomething () {
    $ currentUserId = $ this-> currentUser-> id ();
    /* ... * /
  }
}
 

Этот шаблон позволяет тестировать ваш код в полной изоляции с помощью объекта dummy $ currentUser (что-либо, что реализует AccountProxyInterface ) и может значительно сократить накладные расходы на обслуживание.

Однако DI не очень интуитивно понятен и требует времени, чтобы понять. Как вы получаете услугу в свой конструктор объектов, зависит от того, какой объект на самом деле находится в Drupal, например. плагины ведут себя иначе, чем зарегистрированные сервисы. Более подробная информация о DI в Drupal 8 в do docs .

[edit] Предлагаемое редактирование этого ответа (которое было отклонено модераторами) ввело public static function create () в код, без каких-либо дополнительных пояснений. Однако было бы неверно добавлять этот метод класса без дальнейшего обсуждения.

Метод класса not , используемый любыми службами, которые вы регистрируете с помощью модуля mymodule.services.yml : для них контейнер вызывает конструктор напрямую. Это всегда полезно для инъекций в классы без обслуживания; например:

  • создание пользовательской формы: вы должны объявить, что реализуете ContainerInjectionInterface , чтобы контейнер знал, что ищет :: create () .
  • создание плагина Drupal с использованием более широкой архитектуры плагинов: вы должны объявить, что вы реализуете ContainerFactoryPluginInterface , который требует другой сигнатуры метода для :: create () .

Это не то место, где слишком сильно расширяется вложение зависимостей, но доступна дополнительная информация о методе :: create () на этом blogpost .

ответил J-P 20 J0000006Europe/Moscow 2017, 16:42:36
0

Я знаю, что это старый пост, но принятый ответ не сработал для меня.

Это то, что работало для меня:

  $ user = \ Drupal :: currentUser ();
$ uid = $ user-> id ();
 
ответил Andrew Webs 31 J000000Tuesday18 2018, 19:56:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132