Jak uzyskać identyfikator użytkownika dla aktualnie zalogowanego użytkownika?


31

Chcę uzyskać bieżący obiekt użytkownika (informacje o użytkowniku) w Drupal 8.

Wiem, że w Drupal 7 istniała $userzmienna globalna ; Chcę wiedzieć, jak mogę uzyskać bieżący obiekt użytkownika w Drupal 8.

Odpowiedzi:


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

Zobacz Drupalklasę. Istnieje wiele metod pomocniczych; większość z nich to skróty do usług, więc nie musisz dzwonić\Drupal::service() bezpośrednio.

Zauważ, że bieżący użytkownik nie jest jednostką użytkownika, to tylko proxy użytkownika. Możesz uzyskać z niej podstawowe informacje, ale nie ma pól lub innej logiki specyficznej dla jednostki. Aby uzyskać dostęp do encji użytkownika, musisz załadować ją ręcznie:

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

Niestety nie ma bezpośredniej metody takiej jak \Drupal::currentUser()->getEntity():(


20

Przykład ładowania bieżącego użytkownika i pobierania danych pola z obiektu użytkownika.

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

Dostęp do metod \Drupalklasy globalnej (np. ::currentUser()) Jest poprawny w kodzie proceduralnym (np. W twoim mymodule.modulepliku), ale we własnym kodzie OO powinieneś spróbować uzyskać dostęp do @current_userusługi za pomocą standardowego wzorca zwanego wstrzykiwaniem zależności (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();
    /* ... */
  }
}

Ten wzorzec pozwala na testowanie kodu w całkowitej izolacji, z atrapą $currentUserobiektu (wszystko, co implementuje AccountProxyInterfacei może znacznie zmniejszyć koszty utrzymania).

Jednak DI nie jest bardzo intuicyjny i zajmuje trochę czasu, aby zrozumieć. Sposób, w jaki dostaniesz usługę do konstruktora obiektów, zależy od tego, co faktycznie znajduje się w Drupal, np. Wtyczki zachowują się inaczej niż zarejestrowane usługi. Więcej informacji na temat DI znajduje się w Drupal 8 w dokumentacji do .

[edytuj] Wprowadzono sugerowaną edycję tej odpowiedzi (która została odrzucona przez moderatorów) public static function create() do kodu, bez dalszych wyjaśnień. Jednak wprowadzanie tej metody klasowej bez dalszej dyskusji byłoby mylące.

Dla porównania, tak wyglądałaby funkcja 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')
    );
  }

Metoda klasy nie jest używana przez żadne usługi rejestrowane przez moduł mymodule.services.yml: w tym przypadku kontener wywołuje bezpośrednio konstruktor. Jest to zawsze przydatne do wstrzykiwania do klas nieobsługowych; na przykład:

  • tworzenie niestandardowego formularza: musisz zadeklarować wdrożenie, ContainerInjectionInterfaceaby kontener wiedział, czego szukać ::create().
  • tworzenie wtyczki Drupal przy użyciu szerszej architektury wtyczek: musisz zadeklarować implementację ContainerFactoryPluginInterface, która wymaga innej sygnatury metody ::create().

To nie jest miejsce, w którym należy zbytnio rozszerzać się po wstrzyknięciu zależności, ale dalsze informacje na temat ::create()metody są dostępne na tym blogu .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.