मैं वर्तमान में लॉग-इन उपयोगकर्ता के लिए उपयोगकर्ता आईडी कैसे प्राप्त करूं?


31

मैं Drupal 8 में वर्तमान उपयोगकर्ता ऑब्जेक्ट (उपयोगकर्ता जानकारी) प्राप्त करना चाहता हूं।

मुझे पता है कि ड्रुपल 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फ़ाइल में) लेकिन अपने स्वयं के ओओ कोड में आपको @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 में है जैसे कि प्लग इन पंजीकृत सेवाओं से अलग व्यवहार करता है। डॉस 8 में डॉस में डॉक्स पर अधिक जानकारी है ।

[संपादित करें] इस उत्तर को संपादित करने का सुझाव दिया (जिसे मॉडरेटर्स द्वारा अस्वीकार कर दिया गया) public static function 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 Plugin का निर्माण, व्यापक Plugin वास्तुकला का उपयोग करते हुए: आपको इसे लागू करने की घोषणा करनी चाहिए ContainerFactoryPluginInterface, जिसके लिए एक अलग विधि हस्ताक्षर की मांग है ::create()

यह निर्भरता इंजेक्शन पर बहुत अधिक विस्तार करने की जगह नहीं है, लेकिन इस ब्लॉगपोस्ट पर::create() विधि के बारे में अधिक जानकारी उपलब्ध है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.