Come ottengo l'ID utente per l'utente attualmente connesso?


31

Voglio ottenere l'oggetto utente corrente (informazioni utente) in Drupal 8.

So che in Drupal 7 c'era una $uservariabile globale ; Voglio sapere come posso ottenere l'oggetto utente corrente in Drupal 8.

Risposte:


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

Vedi la Drupallezione. Esistono molti metodi di supporto; la maggior parte di essi sono scorciatoie per i servizi, quindi non è necessario chiamare \Drupal::service()direttamente.

Si noti che l'utente corrente non è l'entità utente, è solo un proxy utente. È possibile ottenere alcune informazioni di base da esso ma non sono presenti campi o altre logiche specifiche dell'entità. Per accedere all'entità utente devi caricarla manualmente:

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

Sfortunatamente non esiste un metodo diretto come \Drupal::currentUser()->getEntity():(


20

Esempio di come caricare l'utente corrente e recuperare i dati dei campi dall'oggetto utente.

<?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;
?>

16

L'accesso ai metodi sulla \Drupalclasse globale (come ::currentUser()) è OK nel codice procedurale (ad es. Nel tuo mymodule.modulefile) ma nel tuo codice OO dovresti provare ad accedere al @current_userservizio, tramite un modello standard chiamato dependency injection (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();
    /* ... */
  }
}

Questo modello consente di testare il codice in completo isolamento, con un $currentUseroggetto fittizio (tutto ciò che implementa AccountProxyInterfacee può ridurre enormemente le spese generali di manutenzione.

Tuttavia, DI non è molto intuitivo e richiede un po 'di tempo per capire. Il modo in cui ottieni il servizio nel costruttore di oggetti dipende da ciò che l'oggetto è effettivamente in Drupal, ad esempio i plugin si comportano in modo diverso dai servizi registrati. Ci sono ulteriori informazioni su DI in Drupal 8 nei documenti do .

[modifica] Una modifica suggerita a questa risposta (che è stata respinta dai moderatori) introdotta public static function create()nel codice, senza ulteriori spiegazioni. Tuttavia, sarebbe fuorviante aggiungere questo metodo di classe senza ulteriori discussioni.

Per riferimento, ecco come sarebbe la funzione 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')
    );
  }

Il metodo class non viene utilizzato da nessun servizio registrato tramite un modulo mymodule.services.yml: per questi, il contenitore chiama direttamente il costruttore. È sempre utile solo per l'iniezione in classi non di servizio; per esempio:

  • creazione di un modulo personalizzato: è necessario dichiarare l'implementazione in ContainerInjectionInterfacemodo che il contenitore sappia cercare ::create().
  • creazione di un plug-in Drupal, utilizzando l'architettura più ampia del plug-in: è necessario dichiarare l'implementazione ContainerFactoryPluginInterface, che richiede una firma del metodo diversa per ::create().

Questo non è il luogo per espandere troppo l'iniezione di dipendenza, ma ulteriori informazioni sul ::create()metodo sono disponibili su questo post del blog .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.