Yanıtlar:
$user = \Drupal::currentUser();
Drupal
Sınıfa bakın . Bir çok yardımcı yöntem var; birçoğu hizmetler için kısayollar olduğundan \Drupal::service()
doğrudan arama yapmanız gerekmez .
Mevcut kullanıcının kullanıcı varlığı olmadığını, sadece kullanıcı proxy'si olduğunu unutmayın. Ondan bazı temel bilgiler edinebilirsiniz, ancak alanlar veya varlığa özgü başka bir mantık mevcut değil. Kullanıcıya erişmek için manuel olarak yüklemeniz gerekir:
$user = User::load(\Drupal::currentUser()->id());
Maalesef şöyle bir direkt yöntem yoktur\Drupal::currentUser()->getEntity()
:(
Geçerli kullanıcının nasıl yükleneceği ve alan verilerinin kullanıcı nesnesinden nasıl alınacağı örneği .
<?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;
?>
\Drupal
Global sınıftaki (benzeri ::currentUser()
) yöntemlere erişme , prosedür kodunda tamamdır (örneğin, mymodule.module
dosyanızda) ancak kendi OO kodunuzda @current_user
, bağımlılık enjeksiyonu (DI) adı verilen standart bir kalıp aracılığıyla servise erişmeye çalışmalısınız :
<?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();
/* ... */
}
}
Bu şablon, kodunuzun tam bir izolasyonla, sahte bir $currentUser
nesneyle (uygulayan AccountProxyInterface
ve bakım giderlerini büyük ölçüde azaltabilecek herhangi bir şey) test edilmesine izin verir .
Bununla birlikte, DI çok sezgisel değildir ve anlaşılması biraz zaman alır. Hizmeti nesne kurucunuza nasıl soktuğunuz, örneğin Drupal'daki nesnenin gerçekte ne olduğuna bağlıdır, örneğin eklentiler kayıtlı hizmetlerden farklı davranır. Do Drupal 8'deki DI hakkında daha fazla bilgi var .
[değiştir] Bu cevaba önerilen bir düzenleme (moderatörler tarafından reddedildi) public static function create()
, başka bir açıklama yapmadan koda girmiştir. Ancak, bu sınıf yöntemini daha fazla tartışma olmadan eklemek yanıltıcı olacaktır.
Başvuru için, create () işlevi şöyle görünür:
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_user')
);
}
Sınıf yöntemi olduğunu değil eğer bir modülün aracılığıyla kayıt herhangi servisleri tarafından kullanılan mymodule.services.yml
: Bunlar için, konteyner doğrudan yapıcı çağırır. Hizmet dışı sınıflara enjekte etmek için sadece faydalıdır; Örneğin:
ContainerInjectionInterface
kabı aramayı bilmesi için uyguladığınızı beyan etmeniz gerekir ::create()
.ContainerFactoryPluginInterface
Farklı bir yöntem imzası istediğinizi uyguladığınızı beyan etmelisiniz ::create()
.Bağımlılık enjeksiyonunda çok fazla genişleme yapılacak yer burası değil, ancak bu blog yayınında::create()
yöntem hakkında daha fazla bilgi bulabilirsiniz .