Tipo di suggerimento - che è meglio, UserInterface o AccountInterface?


8

Di recente ho finalmente iniziato a spostare la mia attenzione da D7 a D8 e sto convertendo un sito in D8. In D7, ho suggerito il tipo di oggetti del mio account come \ stdClass, poiché non erano membri di alcuna classe. Tuttavia, in D8, ora sono membri della classe User.

Detto questo, sto scoprendo in alcuni codici in rete che le persone stanno suggerendo come Drupal \ Core \ Session \ AccountInterface e in altri punti come Drupal \ user \ UserInterface. Come dovremmo determinare quale utilizzare per i nostri suggerimenti sul tipo e qual è la differenza tra i due tipi di oggetti?


Penso che entrambe le risposte qui siano decenti (e ho votato entrambi e la domanda), ma penso che entrambi potrebbero fare un lavoro migliore spiegando la differenza tra AccountInterface e UserInterface. In altre parole, perché ne abbiamo uno (e lo implementa in classi) in \ Drupal \ Core \ Session e un altro nel suo modulo \ Drupal \ user. Vengono spiegati i meccanismi, ma non il perché (che è importante capire veramente le differenze).
mpdonadio

Risposte:


6

UserInterfaceestende ContentEntityInterface, EntityChangedInterfacee AccountInterface. Ciò significa che ci sono metodi che UserInterfacedeve essere implementato da un oggetto, ma AccountInterfacenon è necessario che gli oggetti siano implementati . Ad esempio, c'è UserInterface::hasRole(), ma AccountInterface::getRoles(); nel primo caso, esiste un metodo di supporto che consente di verificare che l'oggetto abbia un ruolo specifico, mentre nel secondo caso è necessario scrivere il codice per quello, ottenendo l'elenco dei ruoli con AccountInterface::getRoles().

Quale suggerimento dovrebbe essere utilizzato è dato dalla documentazione. Ad esempio, hook_user_logout()ottiene l'implementazione di un oggetto \Drupal\Core\Session\AccountProxyInterface, poiché ottiene l'oggetto restituito Drupal::currentUser(). Vedi user_logout(), la funzione che invoca 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));

A volte la documentazione per un hook non mostra un suggerimento specifico, come nel caso di hook_user_login(). In questo caso, potrebbe essere utile vedere quale suggerimento viene utilizzato dalle implementazioni di tale hook, ad esempio system_user_login(), che utilizza UserInterfacecome suggerimento per il suo argomento.

Quando non si è sicuri dell'interfaccia corretta implementata dall'oggetto passato a una funzione (incluso un hook), utilizzare quello più generico come suggerimento. Nel caso che descrivi, sarebbe AccountInterface.


4

Poiché UserInterface estende il tipo di impostazione AccountInterface , il suggerimento su AccountInterface consente di accettare entrambi i tipi di oggetti. Puoi pensare a UserInterface come AccountInterface avanzato che dichiara alcuni metodi extra ( hasRole , addRole , removeRole , ecc.). Vorrei utilizzare l' interfaccia AccountInterface laddove possibile a meno che tu non abbia bisogno di alcuni di questi metodi extra.

Un altro dettaglio, l'oggetto di UserInterface dovrebbe anche implementare metodi da ContentEntityInterface e EntityChangedInterface .


2

Controlla la documentazione per AccountInterface:

Definisce un oggetto con ID utente, ruoli e può contenere dati di sessione. L'interfaccia è implementata sia dalla sessione globale che dall'entità utente

È nello Sessionspazio dei nomi per un motivo: rappresenta qualcosa che può avere dati di sessione.

Le interfacce ContentEntityInterfacee EntityChangedInterfaceestese da UserInterfaceti dicono che rappresenta un concetto diverso:

Le entità di contenuto utilizzano i campi per tutte le proprietà delle entità e sono traducibili e revisionabili, mentre le traduzioni e le revisioni possono essere abilitate per tipo di entità.

Definisce un'interfaccia per il rilevamento del timestamp di modifica entità.

Questi dati possono essere utili per invalidare la cache in modo più preciso (soprattutto sul lato client) e il blocco delle modifiche simultanee.

A UserInterfacerappresenta un account utente Drupal completo che può avere revisioni, campi, traduzioni, ecc.


Non posso dirti quale sia più adatto al tuo caso d'uso, ma ti incoraggio a pensare a quale di queste interfacce è più applicabile per il codice che stai scrivendo.

Il mio istinto mi dice che useresti AccountInterfaceper qualcosa che è minimamente "loggato" (es. Utente loggato, un elenco di utenti online, qualcuno che ha effettuato l'accesso tramite SSO) e UserInterfaceper qualcosa di più (es. Profili utente, autori associati, lungo dati vivi, la maggior parte delle cose che facciamo in Drupal).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.