Siempre he ido con esto global $user;
. Sin embargo, parece recordar haber visto algo en un módulo contribuido que devolvió el objeto de usuario actual sin usar el global $user
.
¿Existe tal función en el núcleo de Drupal 7, o está utilizando la variable global la forma recomendada de facto para obtener el objeto de usuario actual?
Respuestas:
La función que podría usar es user_uid_optional_load () ; sin argumentos, devuelve el objeto de usuario para el usuario actualmente conectado. Todavía usa el global
$user
y carga el objeto completo de la base de datos, incluidos los campos asociados a los usuarios, pero evita que su código cambie accidentalmente el contenido de la variable global$user
, ya que no se hace referencia a él desde su código.Si no necesita el objeto completo, puede usar el código que ya se informó en las otras respuestas. Si desea asegurarse de no alterar el objeto global, puede copiar la variable global en una variable local, como en el siguiente fragmento.
En Drupal 8, simplemente usa el método estático
\Drupal::currentUser()
para obtener el equivalente de Drupal 7$GLOBALS['user']
y\Drupal\user\Entity\User::load(\Drupal::currentUser()->id())
obtener un objeto completamente cargado con todos sus campos API de campo. Ya no existe el riesgo de anular una variable global con todas las consecuencias.En el caso de que necesite cambiar el usuario actual con, por ejemplo, el usuario anónimo, el código que usa en Drupal 8 es el siguiente.
fuente
El
$user
objeto se declara como una variable global, por lo que si desea acceder a él, debe usar:o
En realidad, no parece haber una forma estándar de hacer esto en Drupal. Si observa el módulo de nodo, por ejemplo, la
node_access_grants()
función usa este código:Mientras que la siguiente función en el archivo
node_access_view_all_nodes()
, usa esto:La respuesta simple es que ambos son válidos. Creo que el uso de
$GLOBALS
es para que la variable nombrada$user
no esté activa en el alcance actual y, por lo tanto, no se pueda sobrescribir con una llamada descuidada a, por ejemplo,$user = NULL
más adelante en la función. Aunque no estoy al 100% en eso.fuente
global $user;
debe usarse generalmente cuando la variable se refiere más de una vez, y$GLOBALS['user']
debe usarse cuando se usa solo una vez en el código de función; El código Drupal no es constante en eso. Hay un caso en el queglobal $user;
es necesario: cuando se pasa el objeto de usuariodrupal_alter()
para permitir que los módulos de terceros alteren al usuario actualmente activo (que no es algo realmente implementado en Drupal).global $user
no es lo mismo que user_uid_optional_load (). El primero se carga desde la sesión y no es un objeto de usuario completamente cargado (con campos y ganchos invocados) mientras que el segundo sí. Entonces no enumeraría esto como una opción. El propósito de esa función es usarse para argumentos de menú con nombre que opcionalmente pueden aceptar una identificación de usuario y, de lo contrario, ser el valor predeterminado para el usuario actual. / user / uid es el ejemplo principal.global $user
estaba completamente cargado por defecto (aunque tiene sentido y explica un par de cosas que me había preguntado antes). Lo he sacado de la respuesta.Es tan simple como declarar el objeto $ user global (existente) dentro del alcance de su función:
Tenga en cuenta que los cambios realizados en este objeto lo afectan globalmente, es decir
acaba de dar al usuario actual uid 1 privilegios. Esta es la razón por la cual típicamente $ user se asigna a $ account para que los datos puedan ser manipulados sin afectar realmente al usuario actualmente conectado (a menos que, por supuesto, lo desee).
fuente