¿Acceder a los campos de usuario?

18

$account = \Drupal::currentUser()carga el objeto de usuario $account, pero ¿cómo puedo acceder a los campos personalizados que he creado en el objeto de usuario (a través de la interfaz de usuario de administrador)?

Con dpm($account)No puedo ver ninguno de mis campos personalizados.

24ma13wg
fuente
¿Los campos personalizados tienen algún valor todavía? Parece recordar que faltan en el objeto de entidad hasta que realmente tengan un conjunto de valores
Clive
Sí, tienen valores. Puedo obtener el uid \Drupal::currentUser()->id()y luego hacer una consulta a la base de datos, pero ¿en D7 ya estaban allí en el objeto?
24ma13wg
Este problema no se trata solo del usuario de la grosella; generalmente pertenece al objeto del usuario. api.drupal.org/api/drupal/… lo lleva a la mitad del camino, pero como suele ser el caso con Drupal Docs, deja mucho todavía en la oscuridad
mar26.2

Respuestas:

29

\Drupal::currentUser()devuelve un Drupal\Core\Session\AccountInterfaceobjeto Ese podría ser un usuario completo (eso sería un Drupal\user\UserInterface), pero en este momento, para el método de autenticación predeterminado, no lo es.

Use esto para obtener la entidad de usuario y todos los campos:

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

D7 tuvo exactamente el mismo comportamiento, la diferencia ahora es solo que en D7, eran simplemente stdClass'es diferentes, ahora tiene interfaces explícitas para diferenciar los dos.

Berdir
fuente
A pesar del voto negativo, esta respuesta es correcta, incluso sobre Drupal 7. $GLOBALS['user']no contiene un objeto de usuario con carga completa, en Drupal 7; contiene solo la información encontrada en la tabla de usuarios.
kiamlaluno
Sí, no estoy seguro de por qué esto recibió un voto negativo. Es correcto, tanto sobre D7 como sobre D8.
mpdonadio
Esto es solo una parte de la respuesta. Y, de hecho, no te acerca más a los datos que a la "solución" original. Tienes que "obtener" los datos del objeto. Para hacerlo, vea la solución de trabajo publicada por @batigolix a continuación.
sea26.2
Tenga en cuenta que los campos que no tienen valores no aparecerán en la matriz de valores.
JAyenGreen
16

Y aquí está cómo sacarlo de ese objeto:

// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

// Get field data from that user.
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;

// Some default getters include.
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;
Darryn
fuente
1
Obtiene la identificación de usuario con $user->id().
kiamlaluno
Además, la entidad Usuario no tiene un campo base del cuerpo . Si ese es un campo agregado desde la interfaz de usuario, el nombre del campo comenzaría con field_ . Evitaría ese ejemplo, ya que hace que los usuarios piensen que es un campo base agregado del código central de Drupal.
kiamlaluno
1

Drupal::currentUser()devuelve un objeto implementando Drupal\Core\Session\AccountProxyInterface. Eso es diferente de lo que regresó User::load(), que es un objeto de implementación Drupal\user\UserInterface.

Esto significa que no está garantizado que obtenga un Userobjeto completo con sus campos cargados, pero ni siquiera está seguro de que obtenga un Userobjeto. Como consecuencia, llama a algunos de los métodos disponibles de la Userclase, como User::get(). Puede llamar AccountInterface::id(), lo que devuelve la identificación de usuario; con eso, puede cargar el Userobjeto completo con User::load()y tener acceso a todos los módulos de campos adjuntos a la entidad.

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;

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

Con $account, puede acceder a todos los campos asociados con una cuenta de usuario.

kiamlaluno
fuente
Quizás, pero todavía plantea la pregunta: "¿cómo se accede a los campos PERSONALIZADOS". Ver la respuesta anterior de @batigolix
sea26.2
La pregunta es más ¿ $account = \Drupal::currentUser(): dpm($account);Por qué no muestra ningún campo personalizado? pero esta respuesta dice cómo acceder a los campos de entidad de usuario. Como la pregunta no dice a qué campos está intentando acceder el OP, la respuesta solo dice qué método usar. No hay respuestas de @batigolix.
kiamlaluno
-2

Aquí hay una línea, usando la función API:

$account = \Drupal::currentUser()->getAccount();

Después de eso, los campos de usuario serán accesibles.

David Thomas
fuente