回答:
$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')
);
}
クラスのメソッドは、モジュールの:を介して登録するサービスでは使用されませんmymodule.services.yml
。これらの場合、コンテナはコンストラクタを直接呼び出します。非サービスクラスに注入する場合にのみ有用です。例えば:
ContainerInjectionInterface
コンテナが検索することを認識できるように、実装を宣言する必要があります::create()
。ContainerFactoryPluginInterface
。これには、の異なるメソッドシグネチャが必要::create()
です。これは、依存性注入に関してあまり拡張する場所ではありませんが、このブログ投稿で::create()
メソッドに関する詳細情報を入手できます。