web-dev-qa-db-ja.com

ユーザーフィールドにアクセスしますか?

$account = \Drupal::currentUser()は、ユーザーオブジェクトを_$account_にロードしますが、ユーザーオブジェクトで作成したカスタムフィールドに(管理UIを介して)アクセスするにはどうすればよいですか?

dpm($account)を使用すると、カスタムフィールドが表示されません。

20
dbj44

\Drupal::currentUser()Drupal\Core\Session\AccountInterfaceオブジェクトを返します。これは完全なユーザー(Drupal\user\UserInterface)でもかまいませんが、現在のところ、デフォルトの認証方法ではそうではありません。

これを使用して、ユーザーエンティティとすべてのフィールドを取得します。

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

D7の動作はまったく同じでしたが、違いはD7の場合と同じです。これらは単に異なるstdClassのものであり、2つを区別するための明示的なインターフェイスがあります。

32
Berdir

そして、それはそのオブジェクトからそれを取得する方法です:

// 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;
19
Darryn

Drupal::currentUser() は、 _Drupal\Core\Session\AccountProxyInterface_ を実装するオブジェクトを返します。これは、 _Drupal\user\UserInterface_ を実装するオブジェクトであるUser::load()から返されるものとは異なります。

つまり、フィールドがロードされた完全なUserオブジェクトを取得できるとは限りませんが、Userオブジェクトを取得できるとは限りません。結果として、User::get()などのUserクラスから使用可能ないくつかのメソッドを呼び出します。 AccountInterface::id() を呼び出すと、ユーザーIDが返されます。これで、完全なUserオブジェクトをUser::load()でロードし、エンティティにアタッチされているすべてのフィールドモジュールにアクセスできます。

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

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

_$account_を使用すると、ユーザーアカウントに関連付けられているすべてのフィールドにアクセスできます。

1
kiamlaluno