현재 로그인 한 사용자의 사용자 ID를 어떻게 얻습니까?


31

Drupal 8에서 현재 사용자 객체 (사용자 정보)를 얻고 싶습니다.

Drupal 7에는 전역 $user변수 가 있다는 것을 알고 있습니다 . Drupal 8에서 현재 사용자 객체를 얻는 방법을 알고 싶습니다.

답변:


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

Drupal수업을 참조하십시오 . 많은 도우미 메소드가 있습니다. 대부분 서비스 바로 가기이므로 \Drupal::service()직접 전화 할 필요가 없습니다 .

현재 사용자는 사용자 엔터티가 아니며 사용자 프록시 일뿐입니다. 여기에서 몇 가지 기본 정보를 얻을 수 있지만 필드 또는 다른 엔터티 별 논리는 없습니다. 사용자 엔티티에 액세스하려면 수동으로로드해야합니다.

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

불행히도 다음 과 같은 직접적인 방법 은 없습니다\Drupal::currentUser()->getEntity() :(


20

방법의 예제에서는 현재 사용자로드필드 데이터를 검색하는 사용자 개체에서.

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

절차 적 코드 (예 : 파일) 에서는 \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().
  • 더 넓은 플러그인 아키텍처를 사용하여 Drupal 플러그인 만들기 :에 ContainerFactoryPluginInterface대해 다른 메소드 서명이 필요한 구현을 선언해야합니다 ::create().

의존성 주입에 대해 너무 많이 확장 할 수는 없지만 이 블로그 포스트 에서 ::create()메소드 에 대한 추가 정보를 얻을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.