web-dev-qa-db-ja.com

グローバル変数へのアクセスを回避する現在のユーザーオブジェクトを取得する関数はありますか?

私はいつもこれに行ってきましたglobal $user;。しかし、私は、グローバル$user

そのような関数はDrupal 7コアに存在しますか、それとも、現在のユーザーオブジェクトを取得するために事実上推奨されている方法であるグローバル変数を使用していますか?

28
Alex Weber

使用できる関数は ser_uid_optional_load() ;です。引数がない場合、現在ログインしているユーザーのユーザーオブジェクトを返します。それでもグローバル$userを使用し、ユーザーに関連付けられたフィールドを含む完全なオブジェクトをデータベースからロードしますが、コードから参照されないため、コードがグローバル変数$userの内容を誤って変更することを回避します。

function user_uid_optional_load($uid = NULL) {
  if (!isset($uid)) {
    $uid = $GLOBALS['user']->uid;
  }
  return user_load($uid);
}

完全なオブジェクトが必要ない場合は、他の回答ですでに報告されているコードを使用できます。グローバルオブジェクトを変更しないようにする場合は、次のスニペットのように、グローバル変数をローカル変数にコピーできます。

$account = $GLOBALS['user'];
// Use $account.

Drupal 8では、静的メソッド \Drupal::currentUser() を使用してDrupal 7 $GLOBALS['user']に相当するものを取得しますおよび\Drupal\user\Entity\User::load(\Drupal::currentUser()->id())を使用して、すべてのフィールドAPIフィールドを持つ完全にロードされたオブジェクトを取得します。すべての結果でグローバル変数をオーバーライドするリスクはもうありません。
現在のユーザーを匿名ユーザーなどに切り替える必要がある場合、Drupal 8で使用するコードは次のコードです。

$accountSwitcher = Drupal::service('account_switcher');
$accountSwitcher->switchTo(new Drupal\Core\Session\AnonymousUserSession());

// Your code here.

// Eventually, restore the user account.
$accountSwitcher->switchBack();
22
kiamlaluno

_$user_オブジェクトはグローバル変数として宣言されているため、アクセスしたい場合は次のいずれかを使用する必要があります。

_global $user;
$account = $user;
_

または

_$account = $GLOBALS['user'];
_

Drupalでこれを行う標準的な方法は実際にはないようです。たとえば、nodeモジュールを見ると、 node_access_grants() 関数は次のコードを使用しています。

_if (!isset($account)) {
  $account = $GLOBALS['user'];
}
_

ファイルの次の関数 node_access_view_all_nodes() はこれを使用します。

_global $user;
if (!$account) {
  $account = $user;
}
_

簡単な答えは、どちらも有効であるということです。 _$GLOBALS_の使用は、_$user_という名前の変数が現在のスコープでアクティブではないため、たとえば_$user = NULL_への不注意な呼び出しによって上書きされないようにするためだと思います関数でオンにします。私はそれについて100%ではありません。

20
Clive

これは、関数のスコープ内で(既存の)グローバル$ userオブジェクトを宣言するのと同じくらい簡単です。

global $user;

このオブジェクトに加えられた変更はグローバルに影響することに注意してください。

global $user;
$user->uid = 1;

現在のユーザーにuid 1権限を与えただけです。これが、通常$ userが$ accountに割り当てられる理由です。これにより、現在ログインしているユーザーに実際に影響を与えることなくデータをいじくることができます(もちろん、必要な場合を除きます)。

3