Şu anda oturum açan kullanıcının kullanıcı kimliğini nasıl alabilirim?


31

Drupal 8'deki geçerli kullanıcı nesnesini (kullanıcı bilgileri) almak istiyorum.

Drupal 7'de küresel bir $userdeğişken olduğunu biliyorum ; Mevcut kullanıcı nesnesini Drupal 8'de nasıl alabileceğimi bilmek istiyorum.

Yanıtlar:


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

DrupalSı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() :(


20

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

16

\DrupalGlobal sınıftaki (benzeri ::currentUser()) yöntemlere erişme , prosedür kodunda tamamdır (örneğin, mymodule.moduledosyanı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 $currentUsernesneyle (uygulayan AccountProxyInterfaceve 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:

  • özel bir form oluşturma: ContainerInjectionInterfacekabı aramayı bilmesi için uyguladığınızı beyan etmeniz gerekir ::create().
  • daha geniş bir Plugin mimarisini kullanarak bir Drupal Eklentisi oluşturmak: ContainerFactoryPluginInterfaceFarklı 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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.