現在のユーザーオブジェクト(ユーザー情報)をDrupal 8。
私はDrupal 7で知っています。グローバルな$user
変数; Drupal 8.で現在のユーザーオブジェクトを取得する方法を知りたい。
_$user = \Drupal::currentUser();
_
Drupal
クラスを参照してください。ヘルパーメソッドはたくさんあります。それらのほとんどはサービスのショートカットなので、\Drupal::service()
を直接呼び出す必要はありません。
現在のユーザーはユーザーエンティティではなく、単にユーザープロキシであることに注意してください。そこからいくつかの基本情報を取得できますが、フィールドやその他のエンティティ固有のロジックは存在しません。ユーザーエンティティにアクセスするには、手動で読み込む必要があります。
_$user = User::load(\Drupal::currentUser()->id());
_
残念ながらありません\Drupal::currentUser()->getEntity()
のような直接的な方法:(
load current userおよびフィールドデータを取得する方法の例ユーザーオブジェクトから。
<?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 =依存性注入(DI)と呼ばれる標準パターンを介して_@current_user
_サービスにアクセスしようとするコード:
_<?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たとえば、プラグインは登録されたサービスとは異なる動作をします。 DI in Drupal do docsの8 。
[編集]この回答に対する推奨される編集(モデレーターによって拒否されました)は、コードに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')
);
}
_
クラスメソッドはnotであり、モジュールの_mymodule.services.yml
_を介して登録するサービスで使用されます。これらの場合、コンテナはコンストラクタを直接呼び出します。これは、非サービスクラスに注入する場合にのみ役立ちます。例えば:
ContainerInjectionInterface
を実装することを宣言して、コンテナが::create()
を探すことを認識させる必要があります。ContainerFactoryPluginInterface
を実装することを宣言する必要があります。これは::create()
に異なるメソッドシグネチャを要求します。ここは依存関係の注入を拡張する場所ではありませんが、::create()
メソッドに関する詳細情報が利用可能です このブログ投稿で 。