$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.
\Drupal::currentUser()->id()
y luego hacer una consulta a la base de datos, pero ¿en D7 ya estaban allí en el objeto?Respuestas:
\Drupal::currentUser()
devuelve unDrupal\Core\Session\AccountInterface
objeto Ese podría ser un usuario completo (eso sería unDrupal\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:
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.
fuente
$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.Y aquí está cómo sacarlo de ese objeto:
fuente
$user->id()
.Drupal::currentUser()
devuelve un objeto implementandoDrupal\Core\Session\AccountProxyInterface
. Eso es diferente de lo que regresóUser::load()
, que es un objeto de implementaciónDrupal\user\UserInterface
.Esto significa que no está garantizado que obtenga un
User
objeto completo con sus campos cargados, pero ni siquiera está seguro de que obtenga unUser
objeto. Como consecuencia, llama a algunos de los métodos disponibles de laUser
clase, comoUser::get()
. Puede llamarAccountInterface::id()
, lo que devuelve la identificación de usuario; con eso, puede cargar elUser
objeto completo conUser::load()
y tener acceso a todos los módulos de campos adjuntos a la entidad.Con
$account
, puede acceder a todos los campos asociados con una cuenta de usuario.fuente
$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.Aquí hay una línea, usando la función API:
Después de eso, los campos de usuario serán accesibles.
fuente