Risposte:
$user = \Drupal::currentUser();
Vedi la Drupal
lezione. 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()
:(
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;
?>
L'accesso ai metodi sulla \Drupal
classe globale (come ::currentUser()
) è OK nel codice procedurale (ad es. Nel tuo mymodule.module
file) ma nel tuo codice OO dovresti provare ad accedere al @current_user
servizio, 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 $currentUser
oggetto fittizio (tutto ciò che implementa AccountProxyInterface
e 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:
ContainerInjectionInterface
modo che il contenitore sappia cercare ::create()
.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 .