Digite dica - o que é melhor, UserInterface ou AccountInterface?

8

Recentemente, finalmente comecei a mudar meu foco de D7 para D8 e estou convertendo um site para D8. No D7, digitei meus objetos de conta como \ stdClass, pois eles não eram membros de nenhuma classe. No entanto, no D8, eles agora são membros da classe User.

Dito isso, estou descobrindo em algum código na rede que as pessoas estão digitando como Drupal \ Core \ Session \ AccountInterface e em outros lugares como Drupal \ user \ UserInterface. Como devemos determinar qual delas usar para nossas dicas de tipo e qual é a diferença entre os dois tipos de objetos?

Jaypan
fonte
Acho que as duas respostas aqui são decentes (e votei em ambas, bem como na pergunta), mas acho que ambas poderiam fazer um trabalho melhor ao explicar a diferença entre AccountInterface e UserInterface. Em outras palavras, por que temos um (e o implementamos na classe) em \ Drupal \ Core \ Session e outro em seu próprio módulo \ Drupal \ user. A mecânica é explicada, mas não o porquê (que é importante para realmente entender as diferenças).
mpdonadio

Respostas:

6

UserInterfaceestende-se ContentEntityInterface, EntityChangedInterfacee AccountInterface. Isso significa que existem métodos que um objeto implementado UserInterfaceprecisa ter, mas os objetos implementados AccountInterfacenão precisam. Por exemplo, existe UserInterface::hasRole(), mas AccountInterface::getRoles(); no primeiro caso, existe um método auxiliar que permite verificar se o objeto tem uma função específica, enquanto no segundo caso você precisaria escrever seu código para isso, obtendo a lista das funções AccountInterface::getRoles().

Qual dica deve ser usada é fornecida na documentação. Por exemplo, hook_user_logout()obtém um objeto implementado \Drupal\Core\Session\AccountProxyInterface, uma vez que obtém o objeto retornado Drupal::currentUser(). Veja user_logout(), a função invocando hook_user_logout().

  $user = \Drupal::currentUser();

  \Drupal::logger('user')->notice('Session closed for %name.', array('%name' => $user->getAccountName()));

  \Drupal::moduleHandler()->invokeAll('user_logout', array($user));

Às vezes, a documentação para um gancho não mostra uma dica específica, como no caso de hook_user_login(). Nesse caso, poderia ajudar a ver qual dica é usada nas implementações desse gancho, por exemplo system_user_login(), que usa UserInterfacecomo dica para seu argumento.

Quando não tiver certeza da interface correta implementada pelo objeto passado para uma função (incluindo um gancho), use a mais genérica como dica. No caso que você descreve, isso seria AccountInterface.

kiamlaluno
fonte
4

Como UserInterface estende o tipo de configuração AccountInterface , a dica para AccountInterface permitirá que você aceite os dois tipos de objetos. Você pode pensar em UserInterface como AccountInterface avançado, que declara alguns métodos extras ( hasRole , addRole , removeRole etc.). Eu usaria a interface AccountInterface sempre que possível, a menos que você precise de alguns desses métodos extras.

Mais um detalhe, o objeto UserInterface também deve implementar métodos de ContentEntityInterface e EntityChangedInterface .

ya.teck
fonte
2

Verifique a documentação para AccountInterface:

Define um objeto que possui um ID do usuário, funções e pode ter dados da sessão. A interface é implementada pela sessão global e pela entidade do usuário

Ele está no Sessionnamespace por um motivo - representa algo que pode ter dados da sessão.

As interfaces ContentEntityInterfacee EntityChangedInterfaceestendidas UserInterfaceindicam que ele representa um conceito diferente:

As entidades de conteúdo usam campos para todas as suas propriedades de entidade e são traduzíveis e revisáveis, enquanto traduções e revisões podem ser ativadas por tipo de entidade.

Define uma interface para rastreamento de registro de data e hora de alteração de entidade.

Esses dados podem ser úteis para invalidação de cache mais precisa (especialmente no lado do cliente) e bloqueio de edição simultânea.

A UserInterfacerepresenta uma conta de usuário completa do Drupal que pode ter revisões, campos, traduções etc.


Não sei dizer qual é o mais adequado para o seu caso de uso, mas encorajo você a pensar sobre qual dessas interfaces é mais aplicável ao código que você está escrevendo.

Meu instinto me diz que você usaria AccountInterfacepara algo que seja minimamente "logado" (por exemplo, usuário logado, uma lista de usuários on-line, alguém conectado através do SSO) e UserInterfacepara algo mais do que isso (por exemplo, perfis de usuário, autores associados, dados vivos, a maioria das coisas que fazemos no Drupal).

Alex Barrett
fonte