Відповіді:
$user = \Drupal::currentUser();
Дивіться Drupal
клас. Є безліч допоміжних методів; більшість з них - це ярлики для служб, тому вам не доведеться телефонувати \Drupal::service()
безпосередньо.
Зауважте, що поточний користувач не є об'єктом користувача, це лише проксі-користувач. Ви можете отримати якусь основну інформацію з неї, але поля чи інша логіка, що залежить від сутності, немає. Для доступу до об’єкта користувача потрібно завантажити його вручну:
$user = User::load(\Drupal::currentUser()->id());
На жаль , немає прямого методу типу \Drupal::currentUser()->getEntity()
:(
Приклад того, як завантажити поточного користувача та отримати дані поля з об’єкта користувача.
<?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;
?>
Доступ до методів \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()
.ContainerFactoryPluginInterface
, що вимагає іншого підпису методу ::create()
.Це не місце, щоб надто сильно розширюватись щодо введення залежності, але додаткова інформація про ::create()
метод доступна на цьому пості .