Recientemente, finalmente comencé a cambiar mi enfoque de D7 a D8, y estoy convirtiendo un sitio a D8. En D7, escribí los objetos de mi cuenta como \ stdClass, ya que no eran miembros de ninguna clase. Sin embargo, en D8, ahora son miembros de la clase Usuario.
Dicho esto, encuentro en algún código en la red que las personas están insinuando como Drupal \ Core \ Session \ AccountInterface, y en otros lugares como Drupal \ user \ UserInterface. ¿Cómo deberíamos determinar cuál usar para nuestras sugerencias de tipos y cuál es la diferencia entre los dos tipos de objetos?
Respuestas:
UserInterface
se extiendeContentEntityInterface
,EntityChangedInterface
yAccountInterface
. Esto significa que hay métodos queUserInterface
debe implementar un objeto que implementa , pero que los objetos que implementaAccountInterface
no necesitan tener. Por ejemplo, hayUserInterface::hasRole()
, peroAccountInterface::getRoles()
; en el primer caso, hay un método auxiliar que permite verificar que el objeto tiene un rol específico, mientras que en el segundo caso necesitaría escribir su código para eso, obteniendo la lista de los rolesAccountInterface::getRoles()
.La sugerencia que debe usarse se proporciona en la documentación. Por ejemplo,
hook_user_logout()
obtiene un objeto de implementación\Drupal\Core\Session\AccountProxyInterface
, ya que obtiene el objeto devuelto desdeDrupal::currentUser()
. Veruser_logout()
, la función invocandohook_user_logout()
.En algún momento, la documentación de un enlace no muestra una pista específica, como en el caso de
hook_user_login()
. En este caso, podría ser útil ver qué pista se usa a partir de las implementaciones de ese enlace, por ejemplosystem_user_login()
, que se usaUserInterface
como pista para su argumento.Cuando no esté seguro acerca de la interfaz correcta implementada por el objeto pasado a una función (incluido un enlace), use la más genérica como pista. En el caso que describas, eso sería
AccountInterface
.fuente
Como UserInterface extiende la sugerencia de tipo de configuración AccountInterface a AccountInterface le permitiría aceptar ambos tipos de objetos. Puede pensar en UserInterface como AccountInterface avanzado que declara algunos métodos adicionales ( hasRole , addRole , removeRole , etc.). Me gustaría utilizar AccountInterface interfaz siempre que sea posible a menos que necesite algunos de estos métodos adicionales.
Un detalle más, el objeto de UserInterface también debe implementar métodos de ContentEntityInterface y EntityChangedInterface .
fuente
Consulte la documentación para
AccountInterface
:Está en el
Session
espacio de nombres por una razón: representa algo que puede tener datos de sesión.Las interfaces
ContentEntityInterface
yEntityChangedInterface
extendidas por leUserInterface
dicen que representa un concepto diferente:A
UserInterface
representa una cuenta de usuario de Drupal completa que puede tener revisiones, campos, traducciones, etc.No puedo decirte cuál es más adecuado para tu caso de uso, pero te animo a que pienses cuál de estas interfaces es la más adecuada para el código que estás escribiendo.
Mi instinto me dice que usaría
AccountInterface
para algo que está mínimamente "conectado" (por ejemplo, usuario conectado, una lista de usuarios en línea, alguien que inició sesión a través de SSO) yUserInterface
para algo más que eso (por ejemplo, perfiles de usuario, autores asociados, largo tiempo -viva datos, la mayoría de las cosas que hacemos en Drupal).fuente