Escriba sugerencias: ¿cuál es mejor, UserInterface o AccountInterface?

8

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?

Jaypan
fuente
Creo que las dos respuestas aquí son decentes (y he votado a favor de ambas, así como la pregunta), pero creo que ambas podrían hacer un mejor trabajo explicando la diferencia entre AccountInterface y UserInterface. En otras palabras, ¿por qué tenemos uno (y las clases lo implementan) en \ Drupal \ Core \ Session y otro en su propio módulo \ Drupal \ user. Se explican las mecánicas, pero no el por qué (que es importante para comprender realmente las diferencias).
mpdonadio

Respuestas:

6

UserInterfacese extiende ContentEntityInterface, EntityChangedInterfacey AccountInterface. Esto significa que hay métodos que UserInterfacedebe implementar un objeto que implementa , pero que los objetos que implementa AccountInterfaceno necesitan tener. Por ejemplo, hay UserInterface::hasRole(), pero AccountInterface::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 roles AccountInterface::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 desde Drupal::currentUser(). Ver user_logout(), la función 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));

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 ejemplo system_user_login(), que se usa UserInterfacecomo 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.

kiamlaluno
fuente
4

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 .

ya.teck
fuente
2

Consulte la documentación para AccountInterface:

Define un objeto que tiene una identificación de usuario, roles y puede tener datos de sesión. La interfaz global es implementada tanto por la sesión global como por la entidad del usuario

Está en el Sessionespacio de nombres por una razón: representa algo que puede tener datos de sesión.

Las interfaces ContentEntityInterfacey EntityChangedInterfaceextendidas por le UserInterfacedicen que representa un concepto diferente:

Las entidades de contenido usan campos para todas sus propiedades de entidad y son traducibles y revisables, mientras que las traducciones y revisiones se pueden habilitar por tipo de entidad.

Define una interfaz para el seguimiento de marca de tiempo de cambio de entidad.

Estos datos pueden ser útiles para una invalidación de caché más precisa (especialmente en el lado del cliente) y el bloqueo de edición concurrente.

A UserInterfacerepresenta 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 AccountInterfacepara 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) y UserInterfacepara 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).

Alex Barrett
fuente