Como obtenho o ID do usuário atualmente conectado?

31

Quero obter o objeto do usuário atual (informações do usuário) no Drupal 8.

Eu sei que no Drupal 7 havia uma $uservariável global ; Quero saber como obter o objeto de usuário atual no Drupal 8.

Yusef
fonte

Respostas:

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

Veja a Drupalturma. 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():(


fonte
20

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;
?>
DRUPWAY
fonte
16

O acesso a métodos na \Drupalclasse global (como ::currentUser()) é bom no código processual (por exemplo, no seu mymodule.modulearquivo), mas no seu próprio código OO, você deve tentar acessar o @current_userserviç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 $currentUserobjeto fictício (qualquer coisa que implemente AccountProxyInterfacee 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:

  • criando um formulário personalizado: você deve declarar que implementa ContainerInjectionInterfacepara que o contêiner saiba procurar ::create().
  • criando um plug-in Drupal, usando a arquitetura mais ampla de plug-ins: você deve declarar que implementa 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 .

JP
fonte