Answers:
$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中的实际位置,例如,插件的行为与已注册的服务不同。在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()
。ContainerFactoryPluginInterface
,这需要使用的不同方法签名::create()
。这里不是在依赖注入上扩展太多的地方,但是有关此::create()
方法的更多信息可在此Blogpost上找到。