Saya ingin mendapatkan objek pengguna saat ini (informasi pengguna) di Drupal 8.
Saya tahu di Drupal 7 ada $user
variabel global ; Saya ingin tahu bagaimana saya bisa mendapatkan objek pengguna saat ini di Drupal 8.
$user = \Drupal::currentUser();
Lihat Drupal
kelas. Ada banyak metode pembantu; kebanyakan dari mereka adalah pintasan untuk layanan, jadi Anda tidak perlu menelepon \Drupal::service()
langsung.
Perhatikan bahwa pengguna saat ini bukan entitas pengguna, itu hanya proxy pengguna. Anda bisa mendapatkan beberapa informasi dasar dari itu tetapi bidang atau logika khusus entitas lainnya tidak ada. Untuk mengakses entitas pengguna Anda harus memuatnya secara manual:
$user = User::load(\Drupal::currentUser()->id());
Sayangnya tidak ada metode langsung seperti \Drupal::currentUser()->getEntity()
:(
Contoh cara memuat pengguna saat ini dan mengambil data bidang dari objek pengguna.
<?php
// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
// retrieve field data from that user
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;
?>
Mengakses metode pada \Drupal
kelas global (seperti ::currentUser()
) OK dalam kode prosedural (misalnya dalam mymodule.module
file Anda ) tetapi dalam kode OO Anda sendiri, Anda harus mencoba mengakses @current_user
layanan, melalui pola standar yang disebut dependency injection (DI):
<?php
namespace Drupal\mymodule;
use Drupal\Core\Session\AccountProxyInterface;
class MyClass {
/**
* @var AccountProxy
*/
protected $currentUser;
public function __construct(AccountProxyInterface $currentUser) {
$this->currentUser = $currentUser;
};
public function doSomething() {
$currentUserId = $this->currentUser->id();
/* ... */
}
}
Pola ini memungkinkan kode Anda untuk diuji dalam isolasi lengkap, dengan $currentUser
objek tiruan (apa pun yang mengimplementasikan AccountProxyInterface
, dan dapat sangat mengurangi biaya pemeliharaan).
Namun, DI tidak terlalu intuitif dan butuh waktu untuk mengerti. Bagaimana Anda mendapatkan layanan ke konstruktor objek Anda tergantung pada apa objek sebenarnya di Drupal misalnya plugin berperilaku berbeda dari layanan terdaftar. Ada informasi lebih lanjut tentang DI di Drupal 8 di do docs .
[Sunting] Sunting yang disarankan untuk jawaban ini (yang ditolak oleh moderator) dimasukkan public static function create()
ke dalam kode, tanpa penjelasan lebih lanjut. Namun, itu akan menyesatkan untuk menambahkan metode kelas ini tanpa diskusi lebih lanjut.
Untuk referensi, ini akan menjadi seperti apa fungsi create ():
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_user')
);
}
Metode kelas tidak digunakan oleh layanan apa pun yang Anda daftarkan melalui modul mymodule.services.yml
: untuk ini, kontainer memanggil konstruktor secara langsung. Ini hanya berguna untuk menyuntikkan ke kelas non-layanan; sebagai contoh:
ContainerInjectionInterface
sehingga wadah tahu untuk mencari ::create()
.ContainerFactoryPluginInterface
, yang menuntut tanda tangan metode yang berbeda untuk ::create()
.Ini bukan tempat untuk memperluas terlalu banyak pada injeksi ketergantungan, tetapi informasi lebih lanjut tentang ::create()
metode ini tersedia di blogpost ini .