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?
Réponses:
UserInterface
étendContentEntityInterface
,EntityChangedInterface
etAccountInterface
. Cela signifie qu'il existe des méthodes qu'un objet implémentantUserInterface
doit avoir mais que les objets implémentantAccountInterface
n'ont pas besoin d'avoir. Par exemple, il y en aUserInterface::hasRole()
, maisAccountInterface::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 avecAccountInterface::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é parDrupal::currentUser()
. Voiruser_logout()
, la fonction invoquanthook_user_logout()
.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 exemplesystem_user_login()
, qui utiliseUserInterface
comme 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
.la source
À 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 .
la source
Consultez la documentation pour
AccountInterface
:C'est dans l'
Session
espace de noms pour une raison - il représente quelque chose qui peut avoir des données de session.Les interfaces
ContentEntityInterface
etEntityChangedInterface
étendues parUserInterface
vous indiquent qu'il représente un concept différent:A
UserInterface
repré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
AccountInterface
pour quelque chose qui est au moins "connecté" (par exemple utilisateur connecté, une liste d'utilisateurs en ligne, quelqu'un connecté via SSO) etUserInterface
pour 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).la source