Vor kurzem habe ich endlich begonnen, meinen Fokus von D7 auf D8 zu verlagern, und ich konvertiere eine Site auf D8. In D7 habe ich meine Kontoobjekte als \ stdClass angegeben, da sie keiner Klasse angehörten. In D8 sind sie jetzt jedoch Mitglieder der Benutzerklasse.
Das heißt, ich finde in einem Code im Internet, dass Leute als Drupal \ Core \ Session \ AccountInterface und an anderen Stellen als Drupal \ user \ UserInterface tippen. Wie sollen wir bestimmen, welches für unsere Schreibweisen verwendet werden soll, und was ist der Unterschied zwischen den beiden Objekttypen?
Antworten:
UserInterface
erstrecktContentEntityInterface
sichEntityChangedInterface
, undAccountInterface
. Dies bedeutet, dass es Methoden gibt, über die eine ObjektimplementierungUserInterface
verfügen muss, die implementierten ObjekteAccountInterface
jedoch nicht. Zum Beispiel gibt esUserInterface::hasRole()
, aberAccountInterface::getRoles()
; Im ersten Fall gibt es eine Hilfsmethode, mit der überprüft werden kann, ob das Objekt eine bestimmte Rolle hat. Im zweiten Fall müssten Sie Ihren Code dafür schreiben und die Liste der Rollen mit abrufenAccountInterface::getRoles()
.Welcher Hinweis verwendet werden soll, geht aus der Dokumentation hervor. Zum Beispiel
hook_user_logout()
wird ein Objekt implementiert\Drupal\Core\Session\AccountProxyInterface
, da es das zurückgegebene Objekt erhältDrupal::currentUser()
. Sieheuser_logout()
die aufrufende Funktionhook_user_logout()
.Manchmal zeigt die Dokumentation für einen Hook keinen bestimmten Hinweis, wie im Fall von
hook_user_login()
. In diesem Fall kann es hilfreich sein zu sehen, welcher Hinweis beispielsweise aus den Implementierungen dieses Hooks verwendet wirdsystem_user_login()
, derUserInterface
als Hinweis für sein Argument verwendet wird.Wenn Sie sich nicht sicher sind, welche Schnittstelle von dem an eine Funktion übergebenen Objekt (einschließlich eines Hooks) implementiert wurde, verwenden Sie die allgemeinste als Hinweis. In dem von Ihnen beschriebenen Fall wäre das
AccountInterface
.quelle
Als Userinterface erweitert AccountInterface aushärtenden Hinweis auf AccountInterface Sie erlauben würde , beiden Arten von Objekten zu akzeptieren. Sie können sich UserInterface als erweitertes AccountInterface vorstellen, das einige zusätzliche Methoden deklariert ( hasRole , addRole , removeRole usw.). Ich würde die AccountInterface- Schnittstelle verwenden, wo immer dies möglich ist, es sei denn, Sie benötigen einige dieser zusätzlichen Methoden.
Ein weiteres Detail, Objekt von UserInterface sollte auch Methoden von ContentEntityInterface und EntityChangedInterface implementieren .
quelle
Überprüfen Sie die Dokumentation auf
AccountInterface
:Es befindet sich
Session
aus einem bestimmten Grund im Namespace - es repräsentiert etwas, das Sitzungsdaten enthalten kann.Die von
ContentEntityInterface
undEntityChangedInterface
erweiterten Schnittstellen zeigen anUserInterface
, dass es sich um ein anderes Konzept handelt:A steht
UserInterface
für ein vollständiges Drupal-Benutzerkonto, das Revisionen, Felder, Übersetzungen usw. enthalten kann.Ich kann Ihnen nicht sagen, welche für Ihren Anwendungsfall besser geeignet ist, aber ich empfehle Ihnen, darüber nachzudenken, welche dieser Schnittstellen für den von Ihnen geschriebenen Code am besten geeignet ist.
Mein Instinkt sagt mir, dass Sie
AccountInterface
für etwas verwenden würden, das minimal "angemeldet" ist (z. B. angemeldeter Benutzer, eine Liste von Benutzern online, jemand, der über SSO angemeldet ist) undUserInterface
für etwas anderes (z. B. Benutzerprofile, zugeordnete Autoren, lang) -gelebte Daten, die meisten Dinge, die wir in Drupal tun).quelle