Acessar campos de usuário?

18

$account = \Drupal::currentUser()carrega o objeto de usuário $account, mas como faço para acessar os campos personalizados criados no objeto de usuário (por meio da interface do usuário do administrador)?

Com dpm($account)eu não consigo ver nenhum dos meus campos personalizados.

24ma13wg
fonte
Os campos personalizados ainda têm algum valor? Me lembro de eles estarem faltando o objeto de entidade até que eles realmente têm um valor definido
Clive
Sim, eles têm valores. Posso obter o uid \Drupal::currentUser()->id()e fazer uma consulta ao banco de dados, mas no D7 eles já estavam no objeto?
24ma13wg 03/02
Esse problema não é apenas sobre o usuário da groselha; Pertence geralmente ao objeto de usuário. api.drupal.org/api/drupal/... você fica no meio do caminho, mas, como é geralmente o caso com Drupal Docs, deixa muito ainda no escuro
sea26.2

Respostas:

29

\Drupal::currentUser()retorna um Drupal\Core\Session\AccountInterfaceobjeto. Pode ser um usuário completo (seria um Drupal\user\UserInterface), mas, no momento, para o método de autenticação padrão, não é.

Use isso para obter a entidade do usuário e todos os campos:

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

D7 teve exatamente o mesmo comportamento, a diferença agora é que, em D7, eles eram simplesmente diferentes stdClass'es, agora você tem interfaces explícitas para diferenciar os dois.

Berdir
fonte
Apesar do voto negativo, esta resposta está correta, mesmo no Drupal 7. $GLOBALS['user']não contém um objeto de usuário totalmente carregado, no Drupal 7; Ele contém apenas as informações encontradas na tabela de usuários.
kiamlaluno
Sim, não sei por que isso foi prejudicado. Está correto, tanto sobre D7 quanto D8.
mpdonadio
Isso é apenas parte da resposta. E, de fato, você não fica mais perto dos dados do que a "solução" original. Você precisa "obter" os dados do objeto. Para fazer isso - veja a solução de trabalho postada por @batigolix abaixo.
sea26.2
Observe que os campos que não têm valores não aparecerão na matriz de valores.
JAyenGreen 5/09
16

E aqui está como tirá-lo desse objeto:

// 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;
Darryn
fonte
11
Você obtém o ID do usuário $user->id().
kiamlaluno
Além disso, a entidade Usuário não possui um campo base do corpo . Se esse for um campo adicionado a partir da interface do usuário, o nome do campo começará com campo_ . Eu evitaria esse exemplo, pois faz com que os usuários pensem que é um campo básico adicionado ao código principal do Drupal.
kiamlaluno
1

Drupal::currentUser()retorna um objeto implementado Drupal\Core\Session\AccountProxyInterface. Isso é diferente do que retornou User::load(), que é um objeto implementado Drupal\user\UserInterface.

Isso significa que não é garantido que você obtenha um Userobjeto completo com seus campos carregados, mas nem mesmo que você obtenha um Userobjeto. Como conseqüência, você chama alguns dos métodos disponíveis na Userclasse, como User::get(). Você pode ligar AccountInterface::id(), que retorna o ID do usuário; com isso, é possível carregar o Userobjeto completo User::load()e ter acesso a todos os módulos de campos anexados à entidade.

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

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

Com $account, você poderá acessar todos os campos associados a uma conta de usuário.

kiamlaluno
fonte
Talvez, mas ainda implique a pergunta: "como você acessa os campos PERSONALIZADOS". Veja a resposta acima em @batigolix
sea26.2
A questão é mais: por $account = \Drupal::currentUser(): dpm($account);que não mostra nenhum campo personalizado? mas esta resposta diz como acessar os campos de entidade do usuário. Como a pergunta não diz quais campos o OP está tentando acessar, a resposta apenas diz qual método usar. Não há respostas de @batigolix.
kiamlaluno
-2

Aqui está uma linha, usando a função API:

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

Depois disso, os campos do usuário estarão acessíveis.

David Thomas
fonte