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


18

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

dpm($account)私は私のカスタムフィールドのいずれかを見ることができません。


カスタムフィールドにはまだ値がありますか?彼らは実際に値が設定されているまで、彼らはエンティティオブジェクトから欠落している覚えているようだ
クライヴ

はい、値があります。でuidを取得\Drupal::currentUser()->id()してからデータベースクエリを実行できますが、D7では既にオブジェクト上にありましたか?
24ma13wg

この問題は、現在のユーザーだけではありません。通常、ユーザーオブジェクトに関係します。 api.drupal.org/api/drupal / ...で途中まで到達しますが、Drupal Docsの場合と同様に、暗闇の中でまだ多くを残しています
sea26.2

回答:


29

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

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

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

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


ダウン投票にもかかわらず、この答えは正しいです。Drupal7についても、Drupal 7 $GLOBALS['user']では完全にロードされたユーザーオブジェクトが含まれていません。usersテーブルにある情報のみが含まれます。
キアムルノ

ええ、なぜこれが下票になったのか分かりません。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

また、ユーザーエンティティには本文ベースフィールドがありません。ユーザーインターフェイスから追加されたフィールドの場合、フィールド名はfield_始まります。ユーザーがそれをDrupalコアコードから追加された基本フィールドであるとユーザーに思わせるので、この例を回避します。
キアマルノ

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からの回答はありません。
キアマルノ

-2

API関数を使用した1行です。

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

その後、ユーザーフィールドにアクセスできるようになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.