ฉันจะรับ ID ผู้ใช้สำหรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันได้อย่างไร


31

ฉันต้องการรับวัตถุผู้ใช้ปัจจุบัน (ข้อมูลผู้ใช้) ใน Drupal 8

ฉันรู้ใน Drupal 7 มี$userตัวแปรทั่วโลก ฉันต้องการทราบว่าฉันจะรับวัตถุผู้ใช้ปัจจุบันใน Drupal 8 ได้อย่างไร

คำตอบ:


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

ดูDrupalชั้นเรียน มีวิธีการช่วยเหลือมากมาย ส่วนใหญ่เป็นทางลัดสำหรับบริการดังนั้นคุณจึงไม่ต้องโทรติดต่อ\Drupal::service()โดยตรง

โปรดทราบว่าผู้ใช้ปัจจุบันไม่ใช่เอนทิตีผู้ใช้ แต่เป็นเพียงพร็อกซีผู้ใช้ คุณสามารถรับข้อมูลพื้นฐานได้จากมัน แต่ไม่มีฟิลด์หรือตรรกะเฉพาะเอนทิตีอื่น ๆ ในการเข้าถึงเอนทิตีผู้ใช้คุณต้องโหลดด้วยตนเอง:

$user = User::load(\Drupal::currentUser()->id());

น่าเสียดายที่ไม่มีวิธีการโดยตรงเช่น\Drupal::currentUser()->getEntity():(


20

ตัวอย่างของวิธีการโหลดผู้ใช้ปัจจุบันและดึงข้อมูลฟิลด์จากวัตถุผู้ใช้

<?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;
?>

16

การเข้าถึงวิธีการใน\Drupalระดับโลก (เช่น::currentUser()) นั้นใช้ได้ในรหัสขั้นตอน (เช่นในmymodule.moduleไฟล์ของคุณ) แต่ในรหัส OO ของคุณเองคุณควรพยายามเข้าถึง@current_userบริการผ่านรูปแบบมาตรฐานที่เรียกว่าการพึ่งพา (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();
    /* ... */
  }
}

รูปแบบนี้อนุญาตให้โค้ดของคุณผ่านการทดสอบแบบแยกอย่างสมบูรณ์พร้อมกับ$currentUserวัตถุจำลอง(สิ่งใดก็ตามที่ดำเนินการAccountProxyInterfaceและสามารถลดค่าใช้จ่ายในการบำรุงรักษาได้อย่างมหาศาล

อย่างไรก็ตาม DI ไม่เข้าใจง่ายมากและใช้เวลาสักครู่เพื่อทำความเข้าใจ วิธีที่คุณได้รับบริการเข้าสู่ตัวสร้างวัตถุของคุณขึ้นอยู่กับสิ่งที่วัตถุจริงใน Drupal เช่นปลั๊กอินทำงานแตกต่างจากบริการที่ลงทะเบียน มีข้อมูลเพิ่มเติมเกี่ยวกับเป็นDI ใน Drupal 8 ในเอกสารทำ

[แก้ไข] การแก้ไขที่แนะนำสำหรับคำตอบนี้ (ซึ่งถูกปฏิเสธโดยผู้ดำเนินรายการ) แนะนำpublic static function create()ในรหัสโดยไม่มีคำอธิบายเพิ่มเติม อย่างไรก็ตามมันอาจทำให้เข้าใจผิดในการเพิ่มวิธีการเรียนนี้โดยไม่ต้องมีการอภิปรายเพิ่มเติม

สำหรับการอ้างอิงนี่คือสิ่งที่ฟังก์ชั่น 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')
    );
  }

วิธีการเรียนไม่ได้ใช้โดยบริการใด ๆ ที่คุณลงทะเบียนผ่านโมดูลmymodule.services.yml: สำหรับสิ่งเหล่านี้คอนเทนเนอร์จะเรียกตัวสร้างโดยตรง มันมีประโยชน์สำหรับการฉีดเข้าคลาสที่ไม่ใช่บริการเท่านั้น ตัวอย่างเช่น:

  • การสร้างรูปแบบกำหนดเอง: คุณต้องประกาศคุณใช้เพื่อให้ภาชนะรู้ที่จะมองหาContainerInjectionInterface::create()
  • สร้างปลั๊กอิน Drupal โดยใช้สถาปัตยกรรมปลั๊กอินกว้าง: คุณต้องประกาศคุณใช้ซึ่งความต้องการลายเซ็นของวิธีการที่แตกต่างกันสำหรับContainerFactoryPluginInterface::create()

นี่ไม่ใช่สถานที่ที่จะขยายการฉีดพึ่งพามากเกินไป แต่ข้อมูลเพิ่มเติมเกี่ยวกับ::create()วิธีการที่มีอยู่ในบล็อกนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.