Chcę uzyskać bieżący obiekt użytkownika (informacje o użytkowniku) w Drupal 8.
Wiem, że w Drupal 7 istniała $user
zmienna globalna ; Chcę wiedzieć, jak mogę uzyskać bieżący obiekt użytkownika w Drupal 8.
$user = \Drupal::currentUser();
Zobacz Drupal
klasę. 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()
:(
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;
?>
Dostęp do metod \Drupal
klasy globalnej (np. ::currentUser()
) Jest poprawny w kodzie proceduralnym (np. W twoim mymodule.module
pliku), ale we własnym kodzie OO powinieneś spróbować uzyskać dostęp do @current_user
usł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ą $currentUser
obiektu (wszystko, co implementuje AccountProxyInterface
i 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:
ContainerInjectionInterface
aby kontener wiedział, czego szukać ::create()
.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 .