¿Cómo obtengo la ID de usuario para el usuario actualmente conectado?

31

Quiero obtener el objeto de usuario actual (información del usuario) en Drupal 8.

Sé que en Drupal 7 había una $uservariable global ; Quiero saber cómo puedo obtener el objeto de usuario actual en Drupal 8.

Yusef
fuente

Respuestas:

50
$user = \Drupal::currentUser();

Ver la Drupalclase 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():(


fuente
20

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;
?>
DRUPWAY
fuente
16

Acceder a los métodos en la \Drupalclase global (como ::currentUser()) está bien en el código de procedimiento (por ejemplo, en su mymodule.modulearchivo), pero en su propio código OO debe intentar acceder al @current_userservicio, 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 $currentUserobjeto 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:

  • crear un formulario personalizado: debe declarar que implementa ContainerInjectionInterfacepara que el contenedor sepa qué buscar ::create().
  • crear un complemento de Drupal, utilizando la arquitectura más amplia del complemento: debe declarar su implementación 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 .

JP
fuente