답변:
$user = \Drupal::currentUser();
Drupal
수업을 참조하십시오 . 많은 도우미 메소드가 있습니다. 대부분 서비스 바로 가기이므로 \Drupal::service()
직접 전화 할 필요가 없습니다 .
현재 사용자는 사용자 엔터티가 아니며 사용자 프록시 일뿐입니다. 여기에서 몇 가지 기본 정보를 얻을 수 있지만 필드 또는 다른 엔터티 별 논리는 없습니다. 사용자 엔티티에 액세스하려면 수동으로로드해야합니다.
$user = User::load(\Drupal::currentUser()->id());
불행히도 다음 과 같은 직접적인 방법 은 없습니다\Drupal::currentUser()->getEntity()
:(
방법의 예제에서는 현재 사용자로드 및 필드 데이터를 검색하는 사용자 개체에서.
<?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;
?>
절차 적 코드 (예 : 파일) 에서는 \Drupal
전역 클래스 (예 :)의 메소드에 액세스하는 것이 좋지만 자체 OO 코드 에서는 종속성 주입 (DI)이라는 표준 패턴을 통해 서비스 에 액세스해야합니다 .::currentUser()
mymodule.module
@current_user
<?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();
/* ... */
}
}
이 패턴을 사용하면 더미 $currentUser
객체 (구현물로 AccountProxyInterface
유지 보수 오버 헤드를 크게 줄일 수 있는 것)를 사용 하여 코드를 완전히 분리하여 테스트 할 수 있습니다.
그러나 DI는 매우 직관적이지 않으며 이해하는 데 시간이 걸립니다. 서비스를 객체 생성자로 가져 오는 방법은 객체가 Drupal에 실제로 있는지에 따라 다릅니다. 예를 들어 플러그인은 등록 된 서비스와 다르게 동작합니다. 문서에 Drupal 8의 DI에 대한 자세한 정보가 있습니다 .
[편집]이 답변에 대한 제안 된 편집 (중재자가 거부 한)은 public static function create()
추가 설명없이 코드에 도입 되었습니다. 그러나 더 이상 논의하지 않고이 클래스 메소드를 추가하는 것은 오해의 소지가 있습니다.
참고로 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')
);
}
클래스 메소드는 모듈을 통해 등록한 서비스에서 사용 되지 않습니다mymodule.services.yml
.이를 위해 컨테이너는 생성자를 직접 호출합니다. 비 서비스 클래스에 주입 할 때만 유용합니다. 예를 들면 다음과 같습니다.
ContainerInjectionInterface
컨테이너가를 찾도록 구현을 선언해야합니다 ::create()
.ContainerFactoryPluginInterface
대해 다른 메소드 서명이 필요한 구현을 선언해야합니다 ::create()
.의존성 주입에 대해 너무 많이 확장 할 수는 없지만 이 블로그 포스트 에서 ::create()
메소드 에 대한 추가 정보를 얻을 수 있습니다 .