web-dev-qa-db-fra.com

Existe-t-il une fonction pour obtenir l'objet utilisateur actuel qui évite d'accéder à la variable globale?

Je suis toujours allé avec ça global $user;. Cependant, je me souviens avoir vu quelque chose dans un module contribué qui renvoyait l'objet utilisateur actuel sans utiliser le global $user.

Une telle fonction existe-t-elle dans Drupal 7 core, ou utilise la variable globale de la manière recommandée de facto pour obtenir l'objet utilisateur actuel?

28
Alex Weber

La fonction que vous pourriez utiliser est ser_uid_optional_load () ; sans arguments, il renvoie l'objet utilisateur pour l'utilisateur actuellement connecté. Il utilise toujours le global $user Et charge l'objet complet de la base de données, y compris les champs associés aux utilisateurs, mais il évite que votre code modifie accidentellement le contenu de la variable globale $user, Car il n'est pas référencé à partir de votre code.

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

Si vous n'avez pas besoin de l'objet complet, vous pouvez utiliser le code déjà signalé dans les autres réponses. Si vous voulez être sûr de ne pas modifier l'objet global, vous pouvez copier la variable globale dans une variable locale, comme dans l'extrait de code suivant.

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

Dans Drupal 8, vous utilisez simplement la méthode statique \Drupal::currentUser() pour obtenir l'équivalent de Drupal 7 $GLOBALS['user'] Et \Drupal\user\Entity\User::load(\Drupal::currentUser()->id()) pour obtenir un objet entièrement chargé avec tous ses champs API de champ. Il n'y a plus de risque de surcharger une variable globale avec toutes les conséquences.
Dans le cas où vous devez changer l'utilisateur actuel avec, par exemple, l'utilisateur anonyme, le code que vous utilisez dans Drupal 8 est le suivant.

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

// Your code here.

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

L'objet $user Est déclaré comme une variable globale, donc si vous voulez y accéder, vous devez utiliser soit:

global $user;
$account = $user;

ou

$account = $GLOBALS['user'];

Il ne semble pas y avoir de méthode standard pour le faire dans Drupal. Si vous regardez le module de noeud par exemple, la fonction node_access_grants() utilise ce code:

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

Alors que la toute prochaine fonction du fichier, node_access_view_all_nodes() , utilise ceci:

global $user;
if (!$account) {
  $account = $user;
}

La réponse simple est que les deux sont valides. Je pense que l'utilisation de $GLOBALS Est telle que la variable nommée $user N'est pas active dans la portée actuelle et ne peut donc pas être remplacée par un appel imprudent à, par exemple, $user = NULL plus loin dans la fonction. Mais je ne suis pas à 100% là-dessus.

20
Clive

C'est aussi simple que de déclarer l'objet global $ user (existant) dans le cadre de votre fonction:

global $user;

Gardez à l'esprit que les modifications apportées à cet objet l'affectent globalement, c'est-à-dire.

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

vient de donner à l'utilisateur actuel les privilèges uid 1. C'est pourquoi généralement $ user est affecté à $ account afin que les données puissent être bricolées sans affecter réellement l'utilisateur actuellement connecté (sauf si, bien sûr, vous le vouliez).

3
Charlie Schliesser