Quero obter o objeto do usuário atual (informações do usuário) no Drupal 8.
Eu sei que no Drupal 7 havia uma $user
variável global ; Quero saber como obter o objeto de usuário atual no Drupal 8.
$user = \Drupal::currentUser();
Veja a Drupal
turma. Existem muitos métodos auxiliares; a maioria deles são atalhos para serviços, para que você não precise ligar \Drupal::service()
diretamente.
Observe que o usuário atual não é a entidade do usuário, é apenas proxy do usuário. Você pode obter algumas informações básicas, mas campos ou outra lógica específica da entidade não está presente. Para acessar a entidade do usuário, você deve carregá-lo manualmente:
$user = User::load(\Drupal::currentUser()->id());
Infelizmente, não existe um método direto como \Drupal::currentUser()->getEntity()
:(
Exemplo de como carregar o usuário atual e recuperar dados de campo do objeto do usuário.
<?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;
?>
O acesso a métodos na \Drupal
classe global (como ::currentUser()
) é bom no código processual (por exemplo, no seu mymodule.module
arquivo), mas no seu próprio código OO, você deve tentar acessar o @current_user
serviço, por meio de um padrão padrão chamado injeção de dependência (DI):
<?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();
/* ... */
}
}
Esse padrão permite que seu código seja testado em isolamento completo, com um $currentUser
objeto fictício (qualquer coisa que implemente AccountProxyInterface
e possa reduzir enormemente as despesas gerais de manutenção.
No entanto, o DI não é muito intuitivo e leva um tempo para entender. Como você obtém o serviço no construtor de objetos depende do que o objeto realmente está no Drupal, por exemplo, os plugins se comportam de maneira diferente dos serviços registrados. Há mais informações sobre DI no Drupal 8 nos documentos do .
[editar] Uma edição sugerida para esta resposta (que foi rejeitada pelos moderadores) introduzida public static function create()
no código, sem mais explicações. No entanto, seria enganoso adicionar esse método de classe sem nenhuma discussão adicional.
Para referência, é assim que a função create () seria:
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_user')
);
}
O método de classe não é usado por nenhum serviço que você registra por meio de um módulo mymodule.services.yml
: para esses, o contêiner chama o construtor diretamente. Só é útil para injetar em classes que não são de serviço; por exemplo:
ContainerInjectionInterface
para que o contêiner saiba procurar ::create()
.ContainerFactoryPluginInterface
, o que exige uma assinatura de método diferente ::create()
.Este não é o lugar para expandir muito a injeção de dependência, mas mais informações sobre o ::create()
método estão disponíveis neste post do blog .