Ketik petunjuk - mana yang lebih baik, UserInterface atau AccountInterface?

8

Baru-baru ini saya akhirnya mulai mengalihkan fokus saya dari D7 ke D8, dan saya mengonversi situs ke D8. Di D7, saya mengetik-mengisyaratkan objek akun saya sebagai \ stdClass, karena mereka bukan anggota kelas apa pun. Namun di D8, mereka sekarang adalah anggota kelas Pengguna.

Yang mengatakan, saya menemukan dalam beberapa kode di internet bahwa orang mengetik sebagai Drupal \ Core \ Session \ AccountInterface, dan di tempat lain sebagai Drupal \ user \ UserInterface. Bagaimana seharusnya kita menentukan yang mana yang akan digunakan untuk petunjuk tip kita, dan apa perbedaan antara kedua jenis objek?

Jaypan
sumber
Saya pikir kedua jawaban di sini layak (dan saya membesarkan keduanya sekaligus pertanyaannya), tapi saya pikir keduanya bisa melakukan pekerjaan yang lebih baik menjelaskan perbedaan antara AccountInterface dan UserInterface. Dengan kata lain, mengapa kita memiliki satu (dan mengklasifikasikannya) di \ Drupal \ Core \ Session dan yang lain di modulnya sendiri \ Drupal \ user. Mekanika dijelaskan, tetapi bukan alasannya (yang penting untuk benar-benar memahami perbedaan).
mpdonadio

Jawaban:

6

UserInterfacemeluas ContentEntityInterface, EntityChangedInterfacedan AccountInterface. Ini berarti ada metode yang UserInterfaceharus dimiliki oleh objek pelaksana tetapi objek yang pelaksana AccountInterfacetidak perlu miliki. Sebagai contoh, ada UserInterface::hasRole(), tetapi AccountInterface::getRoles(); dalam kasus pertama, ada metode pembantu yang memungkinkan untuk memeriksa objek memiliki peran tertentu, sedangkan dalam kasus kedua Anda harus menulis kode Anda untuk itu, mendapatkan daftar peran dengan AccountInterface::getRoles().

Petunjuk mana yang harus digunakan diberikan dari dokumentasi. Misalnya, hook_user_logout()mendapatkan objek yang diimplementasikan \Drupal\Core\Session\AccountProxyInterface, karena objek kembali Drupal::currentUser(). Lihat user_logout(), fungsi memanggil 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));

Kadang-kadang dokumentasi untuk sebuah kail tidak menunjukkan petunjuk khusus, seperti dalam kasus hook_user_login(). Dalam hal ini, bisa membantu untuk melihat petunjuk mana yang digunakan dari implementasi kait itu, misalnya system_user_login(), yang digunakan UserInterfacesebagai petunjuk untuk argumennya.

Saat Anda tidak yakin tentang antarmuka yang benar yang diimplementasikan oleh objek yang diteruskan ke fungsi (termasuk kait), gunakan yang paling umum sebagai petunjuk. Dalam kasus yang Anda jelaskan, itu akan menjadi AccountInterface.

kiamlaluno
sumber
4

Saat UserInterface memperluas petunjuk jenis pengaturan AccountInterface ke AccountInterface akan memungkinkan Anda untuk menerima kedua jenis objek. Anda mungkin berpikir tentang UserInterface sebagai AccountInterface canggih yang mendeklarasikan beberapa metode tambahan ( hasRole , addRole , removeRole , dll). Saya akan menggunakan antarmuka AccountInterface sedapat mungkin kecuali Anda memerlukan beberapa metode tambahan ini.

Satu lagi detail, objek UserInterface juga harus menerapkan metode dari ContentEntityInterface dan EntityChangedInterface .

ya.teck
sumber
2

Periksa dokumentasi untuk AccountInterface:

Menentukan objek yang memiliki id pengguna, peran, dan dapat memiliki data sesi. Antarmuka diimplementasikan baik oleh sesi global dan entitas pengguna

Ada di Sessionnamespace karena suatu alasan - itu mewakili sesuatu yang dapat memiliki data sesi.

The ContentEntityInterfacedan EntityChangedInterfaceantarmuka diperpanjang oleh UserInterfacememberitahu Anda bahwa itu merupakan konsep yang berbeda:

Entitas konten menggunakan bidang untuk semua properti entitasnya dan dapat diterjemahkan dan direvisi, sementara terjemahan dan revisi dapat diaktifkan per jenis entitas.

Menentukan antarmuka untuk pelacakan timestamp perubahan entitas.

Data ini mungkin berguna untuk pembatalan cache yang lebih tepat (terutama di sisi klien) dan penguncian pengeditan bersamaan.

A UserInterfacemewakili akun pengguna Drupal lengkap yang dapat direvisi, bidang, terjemahan, dll.


Saya tidak dapat memberi tahu Anda mana yang lebih cocok untuk kasus penggunaan Anda, tetapi saya mendorong Anda untuk memikirkan antarmuka mana yang paling sesuai untuk kode yang Anda tulis.

Naluri saya memberi tahu saya bahwa Anda akan menggunakan AccountInterfacesesuatu yang minimal "masuk" (misalnya pengguna yang masuk, daftar pengguna online, seseorang yang masuk melalui SSO) dan UserInterfaceuntuk apa pun lebih dari itu (misalnya profil pengguna, penulis terkait, lama -data hidup, kebanyakan hal yang kita lakukan di Drupal).

Alex Barrett
sumber