Bagaimana cara saya mendapatkan ID pengguna untuk pengguna yang saat ini login?

31

Saya ingin mendapatkan objek pengguna saat ini (informasi pengguna) di Drupal 8.

Saya tahu di Drupal 7 ada $uservariabel global ; Saya ingin tahu bagaimana saya bisa mendapatkan objek pengguna saat ini di Drupal 8.

Yusef
sumber

Jawaban:

50
$user = \Drupal::currentUser();

Lihat Drupalkelas. 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():(


sumber
20

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;
?>
DRUPWAY
sumber
16

Mengakses metode pada \Drupalkelas global (seperti ::currentUser()) OK dalam kode prosedural (misalnya dalam mymodule.modulefile Anda ) tetapi dalam kode OO Anda sendiri, Anda harus mencoba mengakses @current_userlayanan, 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 $currentUserobjek 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:

  • membuat formulir kustom: Anda harus mendeklarasikan Anda menerapkan ContainerInjectionInterfacesehingga wadah tahu untuk mencari ::create().
  • membuat Drupal Plugin, menggunakan arsitektur Plugin yang lebih luas: Anda harus mendeklarasikan Anda menerapkan 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 .

JP
sumber