it-swarm-ko.tech

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

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

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

31
Yusef
$user = \Drupal::currentUser();

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

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

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

불행히도 아니오\Drupal::currentUser()->getEntity() :(

52
user21641

사용자 개체에서 load current user필드 데이터 검색 방법의 예.

<?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;
?>
21
DRUPWAY

\Drupal 전역 클래스 (예 : ::currentUser())의 메서드에 액세스하는 것은 절차 코드 (예 : mymodule.module 파일)에서 나름대로 OO 코드 의존성 주입 (DI)이라는 표준 패턴을 통해 @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 예 : 플러그인이 등록 된 서비스와 다르게 동작 함)에 따라 다릅니다. DI in Drupal 8 docs .

[편집]이 답변에 대한 제안 된 편집 (중재자가 거부 한)은 더 이상 설명하지 않고 코드에 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를 통해 등록한 모든 서비스에서 사용되는 not 입니다.이를 위해 컨테이너는 생성자를 직접 호출합니다. 비 서비스 클래스에 주입 할 때만 유용합니다. 예를 들면 다음과 같습니다.

  • 사용자 정의 양식 작성 : 컨테이너가 ::create()을 찾도록 ContainerInjectionInterface을 구현하도록 선언해야합니다.
  • 더 넓은 플러그인 아키텍처를 사용하여 Drupal 플러그인 만들기) : ::create()에 대해 다른 메소드 서명이 필요한 ContainerFactoryPluginInterface을 구현하도록 선언해야합니다.

이것은 의존성 주입에서 너무 많이 확장되지는 않지만 ::create() 메소드에 대한 추가 정보는 사용 가능합니다 이 블로그 포스트 .

17
J-P