如何获取当前登录用户的用户ID?


31

我想在Drupal 8中获取当前的用户对象(用户信息)。

我知道在Drupal 7中有一个全局$user变量。我想知道如何在Drupal 8中获取当前的用户对象。

Answers:


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中的实际位置,例如,插件的行为与已注册的服务不同。在do docs中的Drupal 8中有关于DI的更多信息。

[编辑]对此建议的建议修改(已被主持人拒绝)已引入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')
    );
  }

您通过模块的注册的任何服务都不会使用class方法mymodule.services.yml:为此,容器直接调用构造函数。它只对注入非服务类有用。例如:

  • 创建自定义表单:您必须声明实现,ContainerInjectionInterface以便容器知道要查找::create()
  • 使用更广泛的插件架构创建一个Drupal插件:您必须声明实现ContainerFactoryPluginInterface,这需要使用的不同方法签名::create()

这里不是在依赖注入上扩展太多的地方,但是有关此::create()方法的更多信息可在此Blogpost上找到

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.