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?
Jawaban:
UserInterface
meluasContentEntityInterface
,EntityChangedInterface
danAccountInterface
. Ini berarti ada metode yangUserInterface
harus dimiliki oleh objek pelaksana tetapi objek yang pelaksanaAccountInterface
tidak perlu miliki. Sebagai contoh, adaUserInterface::hasRole()
, tetapiAccountInterface::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 denganAccountInterface::getRoles()
.Petunjuk mana yang harus digunakan diberikan dari dokumentasi. Misalnya,
hook_user_logout()
mendapatkan objek yang diimplementasikan\Drupal\Core\Session\AccountProxyInterface
, karena objek kembaliDrupal::currentUser()
. Lihatuser_logout()
, fungsi memanggilhook_user_logout()
.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, misalnyasystem_user_login()
, yang digunakanUserInterface
sebagai 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
.sumber
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 .
sumber
Periksa dokumentasi untuk
AccountInterface
:Ada di
Session
namespace karena suatu alasan - itu mewakili sesuatu yang dapat memiliki data sesi.The
ContentEntityInterface
danEntityChangedInterface
antarmuka diperpanjang olehUserInterface
memberitahu Anda bahwa itu merupakan konsep yang berbeda:A
UserInterface
mewakili 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
AccountInterface
sesuatu yang minimal "masuk" (misalnya pengguna yang masuk, daftar pengguna online, seseorang yang masuk melalui SSO) danUserInterface
untuk apa pun lebih dari itu (misalnya profil pengguna, penulis terkait, lama -data hidup, kebanyakan hal yang kita lakukan di Drupal).sumber