访问用户字段?


18

$account = \Drupal::currentUser()将用户对象加载到中$account,但是如何访问在用户对象上创建的自定义字段(通过管理UI)?

随着dpm($account)我看不到我的任何自定义字段。


自定义字段是否有任何值?似乎要记住它们在实体对象中一直丢失,直到它们实际设置了一个值
Clive

是的,他们有价值观。我可以使用uid进行\Drupal::currentUser()->id()查询,但是在D7中它们已经在对象上了吗?
2015年

这个问题不仅仅与醋栗用户有关。它通常与用户对象有关。 api.drupal.org/api/drupal/…将您带到了一半,但是像Drupal Docs一样,它仍然处于黑暗中
sea26.2

Answers:


29

\Drupal::currentUser()返回一个Drupal\Core\Session\AccountInterface对象。那可能是一个完整的用户(可能是Drupal\user\UserInterface),但就目前的默认身份验证方法而言,不是。

使用它来获取用户实体和所有字段:

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

D7的行为完全相同,现在的区别仅在于D7中,它们只是不同的stdClass,现在您有了显式接口来区分两者。


尽管投票否决,但即使在Drupal 7 $GLOBALS['user']中,Drupal 7 中也不包含完整的用户对象,这个答案还是正确的。它仅包含在用户表中找到的信息。
kiamlaluno

是的,不知道为什么这会引起反对。关于D7和D8都是正确的。
mpdonadio

这只是答案的一部分。实际上,它使您比原始“解决方案”更接近数据。您必须从对象“获取”数据。为此,请参见下面@batigolix发布的工作解决方案。
sea26.2

请注意,没有值的字段将不会出现在values数组中。
JAyenGreen

16

这是如何将其从该对象中取出:

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

// Get field data from that user.
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;

// Some default getters include.
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;

1
您通过获得用户ID $user->id()
kiamlaluno

此外,User实体没有正文字段。如果这是从用户界面添加的字段,则字段名称将以field_开头。我避免使用该示例,因为它使用户认为这是Drupal核心代码中添加的基础字段。
kiamlaluno

1

Drupal::currentUser()返回实现的对象Drupal\Core\Session\AccountProxyInterface。这与返回的User::load()是对象实现不同Drupal\user\UserInterface

这意味着不能保证您会得到一个完整的User对象,并且要加载其字段,但是甚至不能保证您会得到一个User对象。结果,您调用调用User该类中的一些可用方法,例如User::get()。您可以调用AccountInterface::id(),返回用户ID。这样,您就可以使用加载整个User对象,User::load()并有权访问附加到该实体的所有字段模块。

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;

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

使用$account,您可以访问与用户帐户关联的所有字段。


也许,但是它仍然引出一个问题:“如何访问自定义字段”。参见@batigolix的答复
sea26.2

问题是更多为什么$account = \Drupal::currentUser(): dpm($account);不显示任何自定义字段?但是此答案说明了如何访问用户实体字段。由于问题没有说明OP尝试访问哪个字段,因此答案仅说明要使用哪种方法。@batigolix没有答案。
kiamlaluno

-2

这是使用API​​函数的单行代码:

$account = \Drupal::currentUser()->getAccount();

之后,将可以访问用户字段。

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.