現在ログインしているユーザーのユーザーIDを取得するにはどうすればよいですか?


31

Drupal 8で現在のユーザーオブジェクト(ユーザー情報)を取得したい。

Drupal 7にはグローバル$user変数があったことを知っています。Drupal 8で現在のユーザーオブジェクトを取得する方法を知りたい。

回答:


50
$user = \Drupal::currentUser();

Drupalクラスをご覧ください。多くのヘルパーメソッドがあります。それらのほとんどはサービスのショートカットであるため、\Drupal::service()直接呼び出す必要はありません。

現在のユーザーはユーザーエンティティではなく、単なるユーザープロキシであることに注意してください。それからいくつかの基本情報を取得できますが、フィールドまたはその他のエンティティ固有のロジックは存在しません。ユーザーエンティティにアクセスするには、手動で読み込む必要があります。

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

残念ながら、:(のような直接的な方法はありません\Drupal::currentUser()->getEntity()


20

現在のユーザーロードし、ユーザーオブジェクトからフィールドデータ取得する方法の例。

<?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;
?>

16

\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 8DIに関する詳細情報があります。

[編集]この回答に対する提案された編集(モデレーターによって拒否され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()
  • より広いプラグインアーキテクチャを使用してDrupalプラグインを作成する:を宣言する必要がありますContainerFactoryPluginInterface。これには、の異なるメソッドシグネチャが必要::create()です。

これは、依存性注入に関してあまり拡張する場所ではありませんが、このブログ投稿で::create()メソッドに関する詳細情報を入手できます。

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