사용자 필드에 액세스 하시겠습니까?


18

$account = \Drupal::currentUser()에 사용자 개체를로드 $account하지만 관리자 UI를 통해 사용자 개체에서 만든 사용자 정의 필드에 어떻게 액세스합니까?

dpm($account)사용자 정의 필드를 볼 수 없습니다.


맞춤 입력란에 아직 값이 있습니까? 실제로 값이 설정 될 때까지 엔티티 객체에서 누락 된 것을 기억하는 것 같습니다
Clive

예, 가치가 있습니다. uid를 가져 와서 \Drupal::currentUser()->id()데이터베이스 쿼리를 수행 할 수는 있지만 D7에서는 이미 객체에 있었습니까?
24ma13wg

이 문제는 건포도 사용자에 관한 것이 아닙니다. 일반적으로 사용자 개체와 관련이 있습니다. api.drupal.org/api/drupal/...는 중간 사용자를 안내하지만, 일반적으로 드루팔 문서의 경우와 같이, 그것은 어둠 속에서 많은 여전히 잎
sea26.2

답변:


29

\Drupal::currentUser()Drupal\Core\Session\AccountInterface객체를 반환 합니다. 전체 사용자 Drupal\user\UserInterface일 수도 있지만 () 기본 인증 방법으로는 그렇지 않습니다.

이것을 사용하여 사용자 엔티티와 모든 필드를 가져옵니다.

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

D7은 정확히 동일한 동작을 가졌으며 이제 차이점은 D7에서는 단순히 다른 stdClass라는 점입니다. 이제 두 가지를 구별 할 수있는 명시적인 인터페이스가 있습니다.


다운 투표에도 불구하고 Drupal 7에서도이 답변은 정확합니다. Drupal 7 $GLOBALS['user']에는 완전히로드 된 사용자 개체가 포함되어 있지 않습니다. users 테이블에있는 정보 만 포함합니다.
kiamlaluno

그래, 왜 이것이 공감대를 얻었는지 모르겠다. D7과 D8 모두 맞습니다.
mpdonadio

이것은 답변의 일부일뿐입니다. 사실, 원래의 "솔루션"보다 데이터에 더 가까이 가지 않습니다. 객체에서 데이터를 "가져와야"합니다. 그렇게하려면-아래 @batigolix가 게시 한 작업 솔루션을 참조하십시오.
sea26.2

값이없는 필드는 값 배열에 나타나지 않습니다.
JAyenGreen

16

그리고 그 객체에서 그것을 꺼내는 방법은 다음과 같습니다.

// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

// Get field data from that user.
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;

// Some default getters include.
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;

1
로 사용자 ID를 얻습니다 $user->id().
kiamlaluno

또한 사용자 엔터티에는 본문 베이스 필드 가 없습니다 . 이것이 사용자 인터페이스에서 추가 된 필드 인 경우 필드 이름은 field_로 시작 합니다. Drupal 코어 코드에서 추가 된 기본 필드라고 사용자가 생각하게하므로이 예제는 피합니다.
kiamlaluno

1

Drupal::currentUser()구현하는 객체를 반환합니다 Drupal\Core\Session\AccountProxyInterface. 이것은 User::load()구현 한 객체 인 로부터 반환 된 것과 다릅니다 Drupal\user\UserInterface.

User, 필드가로드 된 전체 객체 를 얻을 수는 없지만 User객체 를 얻을 수는 없습니다 . 결과적으로 User클래스 에서 사용할 수있는 일부 메소드 (예 :)를 호출합니다 User::get(). 을 호출 AccountInterface::id()하면 사용자 ID가 반환됩니다. 이를 통해 전체 User개체 를로드 User::load()하고 엔터티에 연결된 모든 필드 모듈에 액세스 할 수 있습니다.

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;

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

를 사용하면 $account사용자 계정과 관련된 모든 필드에 액세스 할 수 있습니다.


아마도 "여러분은 CUSTOM 필드에 어떻게 접근합니까?"라는 질문을 여전히 간청합니다. 위의 답변을 @batigolix
sea26.2에서

문제는 더 많은 것입니다 $account = \Drupal::currentUser(): dpm($account);사용자 정의 필드를 표시하지 않습니까? 그러나이 답변은 사용자 엔티티 필드에 액세스하는 방법을 알려줍니다. 질문에 OP가 어떤 필드에 액세스하려고하는지에 대한 설명이 없으므로 답은 사용할 방법 만 알려줍니다. @batigolix의 답변이 없습니다.
kiamlaluno

-2

다음은 API 함수를 사용하는 하나의 라이너입니다.

$account = \Drupal::currentUser()->getAccount();

그 후에는 사용자 필드에 액세스 할 수 있습니다.

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