Saya selalu pergi dengan ini global $user;
. Namun, saya ingat untuk melihat sesuatu dalam modul kontribusi yang mengembalikan objek pengguna saat ini tanpa menggunakan global $user
.
Apakah fungsi seperti itu ada di inti Drupal 7, atau menggunakan variabel global cara yang direkomendasikan secara de-facto untuk mendapatkan objek pengguna saat ini?
Jawaban:
Fungsi yang dapat Anda gunakan adalah user_uid_optional_load () ; tanpa argumen, ia mengembalikan objek pengguna untuk pengguna yang saat ini masuk. Itu masih menggunakan global
$user
, dan memuat objek penuh dari database, termasuk bidang yang terkait dengan pengguna, tetapi itu menghindari kode Anda secara tidak sengaja mengubah konten variabel global$user
, karena tidak dirujuk dari kode Anda.Jika Anda tidak memerlukan objek lengkap, maka Anda dapat menggunakan kode yang sudah dilaporkan dalam jawaban lain. Jika Anda ingin memastikan Anda tidak mengubah objek global, Anda dapat menyalin variabel global menjadi variabel lokal, seperti dalam cuplikan berikut.
Di Drupal 8, Anda cukup menggunakan metode statis
\Drupal::currentUser()
untuk mendapatkan yang setara dengan Drupal 7$GLOBALS['user']
dan\Drupal\user\Entity\User::load(\Drupal::currentUser()->id())
untuk mendapatkan objek yang dimuat penuh dengan semua bidang API bidangnya. Tidak ada lagi risiko mengesampingkan variabel global dengan semua konsekuensinya.Jika Anda perlu mengganti pengguna saat ini dengan, misalnya, pengguna anonim, kode yang Anda gunakan di Drupal 8 adalah yang berikut.
sumber
The
$user
objek dinyatakan sebagai variabel global, jadi jika Anda ingin mengaksesnya Anda perlu untuk menggunakan:atau
Sebenarnya tidak ada cara standar untuk melakukan ini di Drupal. Misalnya, jika Anda melihat modul simpul,
node_access_grants()
fungsinya menggunakan kode ini:Sedangkan fungsi selanjutnya dalam file
node_access_view_all_nodes()
,, menggunakan ini:Jawaban sederhananya adalah keduanya valid. Saya pikir penggunaannya
$GLOBALS
adalah agar variabel bernama$user
tidak aktif dalam lingkup saat ini dan oleh karena itu tidak dapat ditimpa oleh panggilan ceroboh ke, misalnya,$user = NULL
lebih lanjut dalam fungsi. Saya tidak 100% tentang itu.sumber
global $user;
harus secara umum digunakan ketika variabel dirujuk lebih dari satu kali, dan$GLOBALS['user']
harus digunakan ketika digunakan hanya sekali dalam kode fungsi; Kode Drupal tidak konstan dalam hal itu. Ada kasus di managlobal $user;
diperlukan: ketika objek pengguna dilewatkan kedrupal_alter()
untuk memungkinkan modul pihak ketiga untuk mengubah pengguna yang sedang aktif (yang bukan sesuatu yang benar-benar diimplementasikan dalam Drupal).global $user
tidak sama dengan user_uid_optional_load (). Yang pertama dimuat dari sesi dan bukan objek pengguna yang terisi penuh (dengan bidang dan kait dilibatkan) sedangkan yang kedua adalah. Jadi saya tidak akan mencantumkan ini sebagai opsi. Tujuan dari fungsi itu adalah untuk digunakan untuk argumen menu bernama yang secara opsional dapat menerima id pengguna dan jika tidak default untuk pengguna saat ini. / user / uid adalah contoh utama.global $user
itu tidak sepenuhnya dimuat secara default (meskipun masuk akal dan menjelaskan beberapa hal yang saya bertanya-tanya sebelumnya). Saya sudah mengeluarkannya dari jawabannya.Ini sesederhana mendeklarasikan objek $ global pengguna (yang ada) dalam lingkup fungsi Anda:
Perlu diingat bahwa perubahan yang dilakukan pada objek ini memengaruhinya secara global, yaitu
baru saja memberi pengguna saat ini 1 hak istimewa. Inilah sebabnya biasanya $ user ditugaskan ke $ akun sehingga data dapat diutak-atik tanpa benar-benar memengaruhi pengguna yang saat ini masuk (kecuali, tentu saja, Anda ingin).
sumber