Câu trả lời:
$user = \Drupal::currentUser();
Xem Drupal
lớ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()
:(
Ví dụ về cách tải người dùng hiện tại và truy 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;
?>
Truy cập các phương thức trên \Drupal
lớp toàn cầu (như ::currentUser()
) là OK trong mã thủ tục (ví dụ: trong mymodule.module
tệ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_user
dị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 AccountProxyInterface
và 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ụ:
ContainerInjectionInterface
để container biết tìm kiếm ::create()
.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 .