Làm cách nào để có được ID người dùng cho người dùng hiện đang đăng nhập?


31

Tôi muốn lấy đối tượng người dùng hiện tại (thông tin người dùng) trong Drupal 8.

Tôi biết trong Drupal 7 có một $userbiến toàn cầu ; Tôi muốn biết làm thế nào tôi có thể có được đối tượng người dùng hiện tại trong Drupal 8.

Câu trả lời:


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

Xem Drupallớp. Có rất nhiều phương pháp trợ giúp; hầu hết trong số chúng là các phím tắt cho các dịch vụ, vì vậy bạn không phải gọi \Drupal::service()trực tiếp.

Lưu ý rằng người dùng hiện tại không phải là thực thể người dùng, nó chỉ là proxy người dùng. Bạn có thể nhận được một số thông tin cơ bản từ nó nhưng các trường hoặc logic cụ thể khác không có mặt. Để truy cập thực thể người dùng, bạn phải tải thủ công:

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

Thật không may , không có phương pháp trực tiếp như \Drupal::currentUser()->getEntity():(


20

Ví dụ về cách tải người dùng hiện tạitruy xuất dữ liệu trường từ đối tượng người dùng.

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

Truy cập các phương thức trên \Drupallớp toàn cầu (như ::currentUser()) là OK trong mã thủ tục (ví dụ: trong mymodule.moduletệp của bạn ) nhưng trong mã OO của riêng bạn, bạn nên thử truy cập @current_userdịch vụ, thông qua một mẫu chuẩn được gọi là tiêm phụ thuộc (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();
    /* ... */
  }
}

Mẫu này cho phép mã của bạn được kiểm tra cách ly hoàn toàn, với một $currentUserđối tượng giả (bất cứ thứ gì thực hiện AccountProxyInterfacevà có thể giảm đáng kể chi phí bảo trì.

Tuy nhiên, DI không trực quan lắm và cần một chút thời gian để hiểu. Cách bạn đưa dịch vụ vào hàm tạo đối tượng của mình tùy thuộc vào đối tượng thực sự trong Drupal, ví dụ như các plugin hoạt động khác với các dịch vụ đã đăng ký. Có thêm thông tin về DI trong Drupal 8 trong các tài liệu .

[sửa] Một chỉnh sửa được đề xuất cho câu trả lời này (đã bị người kiểm duyệt từ chối) đưa public static function create()vào mã, không có giải thích gì thêm. Tuy nhiên, thật sai lầm khi thêm phương thức lớp này mà không cần thảo luận thêm.

Để tham khảo, đây là hàm tạo () trông như thế nào:

  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('current_user')
    );
  }

Phương thức lớp không được sử dụng bởi bất kỳ dịch vụ nào bạn đăng ký thông qua mô-đun mymodule.services.yml: đối với những dịch vụ này, container gọi trực tiếp đến hàm tạo. Nó chỉ hữu ích khi tiêm vào các lớp không dịch vụ; ví dụ:

  • tạo một biểu mẫu tùy chỉnh: bạn phải khai báo bạn triển khai ContainerInjectionInterfaceđể container biết tìm kiếm ::create().
  • tạo Plugin Drupal, sử dụng kiến ​​trúc Plugin rộng hơn: bạn phải khai báo bạn triển khai ContainerFactoryPluginInterface, yêu cầu chữ ký phương thức khác ::create().

Đây không phải là nơi để mở rộng quá nhiều vào việc tiêm phụ thuộc, nhưng thông tin thêm về ::create()phương pháp này có sẵn trên blogpost này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.