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?
Respostas:
UserInterface
estende-seContentEntityInterface
,EntityChangedInterface
eAccountInterface
. Isso significa que existem métodos que um objeto implementadoUserInterface
precisa ter, mas os objetos implementadosAccountInterface
não precisam. Por exemplo, existeUserInterface::hasRole()
, masAccountInterface::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çõesAccountInterface::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 retornadoDrupal::currentUser()
. Vejauser_logout()
, a função invocandohook_user_logout()
.À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 exemplosystem_user_login()
, que usaUserInterface
como 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
.fonte
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 .
fonte
Verifique a documentação para
AccountInterface
:Ele está no
Session
namespace por um motivo - representa algo que pode ter dados da sessão.As interfaces
ContentEntityInterface
eEntityChangedInterface
estendidasUserInterface
indicam que ele representa um conceito diferente:A
UserInterface
representa 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
AccountInterface
para algo que seja minimamente "logado" (por exemplo, usuário logado, uma lista de usuários on-line, alguém conectado através do SSO) eUserInterface
para algo mais do que isso (por exemplo, perfis de usuário, autores associados, dados vivos, a maioria das coisas que fazemos no Drupal).fonte