Quiero obtener el objeto de usuario actual (información del usuario) en Drupal 8.
Sé que en Drupal 7 había una $user
variable global ; Quiero saber cómo puedo obtener el objeto de usuario actual en Drupal 8.
$user = \Drupal::currentUser();
Ver la Drupal
clase Hay muchos métodos de ayuda; la mayoría de ellos son accesos directos para servicios, por lo que no tiene que llamar \Drupal::service()
directamente.
Tenga en cuenta que el usuario actual no es la entidad del usuario, es solo un proxy del usuario. Puede obtener información básica, pero los campos u otra lógica específica de la entidad no están presentes. Para acceder a la entidad de usuario, debe cargarla manualmente:
$user = User::load(\Drupal::currentUser()->id());
Desafortunadamente no hay un método directo como \Drupal::currentUser()->getEntity()
:(
Ejemplo de cómo cargar el usuario actual y recuperar datos de campo del objeto de usuario.
<?php
// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
// retrieve field data from that user
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;
?>
Acceder a los métodos en la \Drupal
clase global (como ::currentUser()
) está bien en el código de procedimiento (por ejemplo, en su mymodule.module
archivo), pero en su propio código OO debe intentar acceder al @current_user
servicio, a través de un patrón estándar llamado inyección de dependencia (DI):
<?php
namespace Drupal\mymodule;
use Drupal\Core\Session\AccountProxyInterface;
class MyClass {
/**
* @var AccountProxy
*/
protected $currentUser;
public function __construct(AccountProxyInterface $currentUser) {
$this->currentUser = $currentUser;
};
public function doSomething() {
$currentUserId = $this->currentUser->id();
/* ... */
}
}
Este patrón permite que su código se pruebe de forma completamente aislada, con un $currentUser
objeto ficticio (cualquier cosa que implemente AccountProxyInterface
, y puede reducir enormemente los gastos generales de mantenimiento.
Sin embargo, DI no es muy intuitivo y lleva un tiempo entenderlo. La forma en que obtiene el servicio en su constructor de objetos depende de lo que realmente es el objeto en Drupal, por ejemplo, los complementos se comportan de manera diferente a los servicios registrados. Hay más información sobre DI en Drupal 8 en los documentos .
[editar] Una edición sugerida a esta respuesta (que fue rechazada por los moderadores) introducida public static function create()
en el código, sin más explicaciones. Sin embargo, sería engañoso agregar este método de clase sin más discusión.
Como referencia, así es como se vería la función create ():
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_user')
);
}
El método de clase no es utilizado por ningún servicio que registre a través de un módulo mymodule.services.yml
: para estos, el contenedor llama directamente al constructor. Solo es útil para inyectarse en clases que no son de servicio; por ejemplo:
ContainerInjectionInterface
para que el contenedor sepa qué buscar ::create()
.ContainerFactoryPluginInterface
, que requiere una firma de método diferente para ::create()
.Este no es el lugar para expandirse demasiado en la inyección de dependencia, pero hay más información sobre el ::create()
método disponible en este blog .