जवाबों:
$user = \Drupal::currentUser();
Drupal
कक्षा देखें । बहुत सारे सहायक तरीके हैं; उनमें से अधिकांश सेवाओं के लिए शॉर्टकट हैं, इसलिए आपको \Drupal::service()
सीधे कॉल करने की आवश्यकता नहीं है ।
ध्यान दें कि वर्तमान उपयोगकर्ता उपयोगकर्ता इकाई नहीं है, यह सिर्फ उपयोगकर्ता प्रॉक्सी है। आप इससे कुछ बुनियादी जानकारी प्राप्त कर सकते हैं लेकिन फ़ील्ड या अन्य इकाई-विशिष्ट तर्क मौजूद नहीं है। उपयोगकर्ता इकाई तक पहुंचने के लिए आपको इसे मैन्युअल रूप से लोड करना होगा:
$user = User::load(\Drupal::currentUser()->id());
दुर्भाग्य से कोई प्रत्यक्ष तरीका नहीं है\Drupal::currentUser()->getEntity()
:(
वर्तमान उपयोगकर्ता को लोड करने और उपयोगकर्ता ऑब्जेक्ट से फ़ील्ड डेटा पुनर्प्राप्त करने का उदाहरण ।
<?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
ग्लोबल क्लास पर एक्सेस करने के तरीके (जैसे ::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()
।ContainerFactoryPluginInterface
, जिसके लिए एक अलग विधि हस्ताक्षर की मांग है ::create()
।यह निर्भरता इंजेक्शन पर बहुत अधिक विस्तार करने की जगह नहीं है, लेकिन इस ब्लॉगपोस्ट पर::create()
विधि के बारे में अधिक जानकारी उपलब्ध है ।