Як отримати ідентифікатор користувача для поточно зареєстрованого користувача?


31

Я хочу отримати об’єкт поточного користувача (інформацію про користувача) в Drupal 8.

Я знаю, що в Drupal 7 була глобальна $userзмінна; Я хочу знати, як я можу отримати об’єкт поточного користувача в Drupal 8.

Відповіді:


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

Дивіться Drupalклас. Є безліч допоміжних методів; більшість з них - це ярлики для служб, тому вам не доведеться телефонувати \Drupal::service()безпосередньо.

Зауважте, що поточний користувач не є об'єктом користувача, це лише проксі-користувач. Ви можете отримати якусь основну інформацію з неї, але поля чи інша логіка, що залежить від сутності, немає. Для доступу до об’єкта користувача потрібно завантажити його вручну:

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

На жаль , немає прямого методу типу \Drupal::currentUser()->getEntity():(


20

Приклад того, як завантажити поточного користувача та отримати дані поля з об’єкта користувача.

<?php
// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

// retrieve field data from that user
$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')->value;
?>

16

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

<?php

namespace Drupal\mymodule;

use Drupal\Core\Session\AccountProxyInterface;

class MyClass {
  /**
   * @var AccountProxy
   */
  protected $currentUser;

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

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

Цей зразок дозволяє перевірити ваш код у повній ізоляції з фіктивним $currentUserоб'єктом (будь-що, що реалізує AccountProxyInterface, і може значно зменшити накладні витрати на обслуговування.

Однак, DI не дуже інтуїтивно зрозумілий і потребує певного часу, щоб зрозуміти. Від того, як ви отримуєте послугу у вашому конструкторі об'єктів, залежить від того, який об’єкт насправді є в Drupal, наприклад, плагіни ведуть себе по-різному від зареєстрованих служб. Більше інформації про DI в Drupal 8 в документах Docs .

[редагувати] Пропонована редакція цієї відповіді (яка була відхилена модераторами), введена public static function create()в код, без додаткових пояснень. Однак було б оманливим додавати цей метод класу без подальшого обговорення.

Для довідки, так виглядає функція create ():

  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('current_user')
    );
  }

Метод класу не використовується жодними службами, які ви реєструєте через модуль mymodule.services.yml: для них контейнер викликає конструктор безпосередньо. Це корисно лише для введення ін'єкцій у неслужбові класи; наприклад:

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

Це не місце, щоб надто сильно розширюватись щодо введення залежності, але додаткова інформація про ::create()метод доступна на цьому пості .

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