Tipphinweis - was ist besser, UserInterface oder AccountInterface?

8

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?

Jaypan
quelle
Ich denke, beide Antworten hier sind anständig (und ich habe beide sowie die Frage positiv bewertet), aber ich denke, beide könnten den Unterschied zwischen AccountInterface und UserInterface besser erklären. Mit anderen Worten, warum haben wir eine (und Klassen, die sie implementieren) in \ Drupal \ Core \ Session und eine andere in ihrem eigenen Modul \ Drupal \ user. Die Mechanik wird erklärt, aber nicht das Warum (was wichtig ist, um die Unterschiede wirklich zu verstehen).
mpdonadio

Antworten:

6

UserInterfaceerstreckt ContentEntityInterfacesich EntityChangedInterface, und AccountInterface. Dies bedeutet, dass es Methoden gibt, über die eine Objektimplementierung UserInterfaceverfügen muss, die implementierten Objekte AccountInterfacejedoch nicht. Zum Beispiel gibt es UserInterface::hasRole(), aber AccountInterface::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 abrufen AccountInterface::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ält Drupal::currentUser(). Siehe user_logout()die aufrufende Funktion 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));

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 wird system_user_login(), der UserInterfaceals 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.

kiamlaluno
quelle
4

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 .

ya.teck
quelle
2

Überprüfen Sie die Dokumentation auf AccountInterface:

Definiert ein Objekt mit einer Benutzer-ID und Rollen sowie Sitzungsdaten. Die Schnittstelle wird sowohl von der globalen Sitzung als auch von der Benutzerentität implementiert

Es befindet sich Sessionaus einem bestimmten Grund im Namespace - es repräsentiert etwas, das Sitzungsdaten enthalten kann.

Die von ContentEntityInterfaceund EntityChangedInterfaceerweiterten Schnittstellen zeigen an UserInterface, dass es sich um ein anderes Konzept handelt:

Inhaltsentitäten verwenden Felder für alle Entitätseigenschaften und sind übersetzbar und überarbeitbar, während Übersetzungen und Überarbeitungen pro Entitätstyp aktiviert werden können.

Definiert eine Schnittstelle für die Zeitstempelverfolgung von Entitätsänderungen.

Diese Daten können nützlich sein, um den Cache genauer zu ungültig zu machen (insbesondere auf der Clientseite) und gleichzeitig die Bearbeitung zu sperren.

A steht UserInterfacefü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 AccountInterfacefür etwas verwenden würden, das minimal "angemeldet" ist (z. B. angemeldeter Benutzer, eine Liste von Benutzern online, jemand, der über SSO angemeldet ist) und UserInterfacefür etwas anderes (z. B. Benutzerprofile, zugeordnete Autoren, lang) -gelebte Daten, die meisten Dinge, die wir in Drupal tun).

Alex Barrett
quelle