Indication de type - quel est le meilleur, UserInterface ou AccountInterface?

8

Récemment, j'ai enfin commencé à déplacer mon attention de D7 à D8, et je convertis un site en D8. Dans D7, j'ai tapé mes objets de compte comme \ stdClass, car ils n'étaient membres d'aucune classe. Cependant en D8, ils sont désormais membres de la classe User.

Cela dit, je trouve dans du code sur le net que les gens font du dactylographie comme Drupal \ Core \ Session \ AccountInterface, et à d'autres endroits comme Drupal \ user \ UserInterface. Comment devrions-nous déterminer celui à utiliser pour nos typographies et quelle est la différence entre les deux types d'objets?

Jaypan
la source
Je pense que les deux réponses ici sont décentes (et j'ai surévalué les deux ainsi que la question), mais je pense que les deux pourraient faire un meilleur travail expliquant la différence entre AccountInterface et UserInterface. En d'autres termes, pourquoi en avons-nous un (et les classes l'implémentent-ils) dans \ Drupal \ Core \ Session et un autre dans son propre module \ Drupal \ user. La mécanique est expliquée, mais pas le pourquoi (ce qui est important pour vraiment comprendre les différences).
mpdonadio

Réponses:

6

UserInterfaceétend ContentEntityInterface, EntityChangedInterfaceet AccountInterface. Cela signifie qu'il existe des méthodes qu'un objet implémentant UserInterfacedoit avoir mais que les objets implémentant AccountInterfacen'ont pas besoin d'avoir. Par exemple, il y en a UserInterface::hasRole(), mais AccountInterface::getRoles(); dans le premier cas, il existe une méthode d'aide permettant de vérifier que l'objet a un rôle spécifique, tandis que dans le second cas vous devrez écrire votre code pour cela, en obtenant la liste des rôles avec AccountInterface::getRoles().

L'astuce à utiliser est donnée dans la documentation. Par exemple, hook_user_logout()obtient un objet implémenté \Drupal\Core\Session\AccountProxyInterface, car il obtient l'objet renvoyé par Drupal::currentUser(). Voir user_logout(), la fonction invoquant 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));

Parfois, la documentation d'un crochet n'affiche pas d'indication spécifique, comme dans le cas de hook_user_login(). Dans ce cas, cela pourrait aider à voir quel indice est utilisé à partir des implémentations de ce hook, par exemple system_user_login(), qui utilise UserInterfacecomme indice pour son argument.

Lorsque vous n'êtes pas sûr de l'interface correcte implémentée par l'objet passé à une fonction (y compris un crochet), utilisez la plus générique comme indice. Dans le cas que vous décrivez, ce serait AccountInterface.

kiamlaluno
la source
4

À mesure que UserInterface étend l' indicateur de type de paramètre AccountInterface à AccountInterface , vous pouvez accepter les deux types d'objets. Vous pouvez penser à UserInterface comme une AccountInterface avancée qui déclare quelques méthodes supplémentaires ( hasRole , addRole , removeRole , etc.). J'utiliser AccountInterface l' interface partout où il est possible que si vous avez besoin de ces méthodes supplémentaires.

Encore un détail, l'objet de UserInterface devrait également implémenter des méthodes de ContentEntityInterface et EntityChangedInterface .

ya.teck
la source
2

Consultez la documentation pour AccountInterface:

Définit un objet qui a un ID utilisateur, des rôles et peut avoir des données de session. L'interface est implémentée à la fois par la session globale et l'entité utilisateur

C'est dans l' Sessionespace de noms pour une raison - il représente quelque chose qui peut avoir des données de session.

Les interfaces ContentEntityInterfaceet EntityChangedInterfaceétendues par UserInterfacevous indiquent qu'il représente un concept différent:

Les entités de contenu utilisent des champs pour toutes leurs propriétés d'entité et sont traduisibles et révisables, tandis que les traductions et les révisions peuvent être activées par type d'entité.

Définit une interface pour le suivi de l'horodatage des modifications d'entité.

Ces données peuvent être utiles pour une invalidation du cache plus précise (en particulier du côté client) et un verrouillage d'édition simultané.

A UserInterfacereprésente un compte utilisateur Drupal complet qui peut avoir des révisions, des champs, des traductions, etc.


Je ne peux pas vous dire ce qui convient le mieux à votre cas d'utilisation, mais je vous encourage à réfléchir à laquelle de ces interfaces est la plus applicable au code que vous écrivez.

Mon instinct me dit que vous utiliseriez AccountInterfacepour quelque chose qui est au moins "connecté" (par exemple utilisateur connecté, une liste d'utilisateurs en ligne, quelqu'un connecté via SSO) et UserInterfacepour autre chose que cela (par exemple, les profils d'utilisateurs, les auteurs associés, les longs -données vécues, la plupart des choses que nous faisons dans Drupal).

Alex Barrett
la source