क्या वर्तमान उपयोगकर्ता वस्तु को प्राप्त करने के लिए एक फ़ंक्शन है जो वैश्विक चर तक पहुंचने से बचता है?


29

मैं हमेशा इसके साथ गया हूं global $user;। हालाँकि, मुझे लगता है कि एक योगदान किए गए मॉड्यूल में कुछ देखकर याद आ रहा है जिसने वैश्विक उपयोग किए बिना वर्तमान उपयोगकर्ता ऑब्जेक्ट को वापस कर दिया $user

क्या ऐसा फ़ंक्शन Drupal 7 कोर में मौजूद है, या वर्तमान उपयोगकर्ता ऑब्जेक्ट प्राप्त करने के लिए वैश्विक चर de-facto अनुशंसित तरीके का उपयोग कर रहा है?


क्यों आप सिर्फ वैश्विक $ उपयोगकर्ता का उपयोग नहीं करेंगे?
सादालुलु

5
वैश्विक $ उपयोगकर्ता का उपयोग संभावित अवांछित व्यवहार बना सकता है अगर यह कोड में बाद में लापरवाही से बदल गया है।
एलेक्स वेबर

जवाबों:


22

आप जिस फ़ंक्शन का उपयोग कर सकते हैं वह user_uid_optional_load () है ; तर्क के बिना, यह वर्तमान में लॉग-इन उपयोगकर्ता के लिए उपयोगकर्ता ऑब्जेक्ट लौटाता है। यह अभी भी वैश्विक का उपयोग करता है $user, और डेटाबेस से पूर्ण ऑब्जेक्ट को लोड करता है, जिसमें उपयोगकर्ताओं से जुड़े फ़ील्ड शामिल हैं, लेकिन यह आपके कोड से गलती से बच जाता है, वैश्विक चर की सामग्री को बदल देता है $user, क्योंकि यह आपके कोड से संदर्भित नहीं है।

function user_uid_optional_load($uid = NULL) {
  if (!isset($uid)) {
    $uid = $GLOBALS['user']->uid;
  }
  return user_load($uid);
}

यदि आपको पूर्ण ऑब्जेक्ट की आवश्यकता नहीं है, तो आप अन्य उत्तरों में पहले से बताए गए कोड का उपयोग कर सकते हैं। यदि आप यह सुनिश्चित करना चाहते हैं कि आप वैश्विक ऑब्जेक्ट में परिवर्तन न करें, तो आप निम्न चर के अनुसार वैश्विक चर को स्थानीय चर में कॉपी कर सकते हैं।

$account = $GLOBALS['user'];
// Use $account.

Drupal 8 में, आप \Drupal::currentUser()Drupal 7 के समतुल्य पाने के लिए $GLOBALS['user']और \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())अपने सभी फ़ील्ड API फ़ील्ड्स के साथ पूरी तरह भरी हुई वस्तु प्राप्त करने के लिए बस स्टैटिक विधि का उपयोग करते हैं। सभी परिणामों के साथ वैश्विक चर को ओवरराइड करने का जोखिम अब नहीं है।
मामले में आपको वर्तमान उपयोगकर्ता के साथ स्विच करने की आवश्यकता है, उदाहरण के लिए, अनाम उपयोगकर्ता, Drupal 8 में आपके द्वारा उपयोग किया जाने वाला कोड निम्नलिखित है।

$accountSwitcher = Drupal::service('account_switcher');
$accountSwitcher->switchTo(new Drupal\Core\Session\AnonymousUserSession());

// Your code here.

// Eventually, restore the user account.
$accountSwitcher->switchBack();

20

$userवस्तु एक वैश्विक चर के रूप में घोषित किया जाता है, आप इसे उपयोग करने के लिए आप या तो उपयोग करने की आवश्यकता चाहते हैं, इसलिए यदि:

global $user;
$account = $user;

या

$account = $GLOBALS['user'];

वहाँ वास्तव में Drupal में ऐसा करने का एक मानक तरीका प्रतीत नहीं होता है। यदि आप उदाहरण के लिए नोड मॉड्यूल को देखते हैं, तो node_access_grants()फ़ंक्शन इस कोड का उपयोग करता है:

if (!isset($account)) {
  $account = $GLOBALS['user'];
}

जबकि फ़ाइल में अगला फ़ंक्शन node_access_view_all_nodes(), इसका उपयोग करता है:

global $user;
if (!$account) {
  $account = $user;
}

इसका सरल उत्तर यह है कि दोनों वैध हैं। मुझे लगता है कि इसका उपयोग $GLOBALSइतना है कि नामांकित चर $userवर्तमान दायरे में सक्रिय नहीं है और इसलिए इसे लापरवाह कॉल द्वारा अधिलेखित नहीं किया जा सकता है, उदाहरण के लिए, $user = NULLफ़ंक्शन में आगे। मैं उस पर हालांकि 100% नहीं हूँ।


मैं वही जानता हूं जो मैं जानता हूं और आपके अंतिम कथन पर सहमत हूं।
सादालुलु

1
global $user;आम तौर पर उपयोग किया जाना चाहिए जब चर को एक से अधिक बार संदर्भित $GLOBALS['user']किया जाता है , और इसका उपयोग तब किया जाना चाहिए जब यह फ़ंक्शन कोड में केवल एक बार उपयोग किया जाता है; Drupal कोड उस में स्थिर नहीं है। एक ऐसा मामला है जहां global $user;आवश्यक है: जब उपयोगकर्ता ऑब्जेक्ट drupal_alter()तीसरे पक्ष के मॉड्यूल को वर्तमान में सक्रिय उपयोगकर्ता (जो वास्तव में Drupal में वास्तव में लागू नहीं होता है) को बदलने के लिए अनुमति देने के लिए पारित किया जाता है।
kiamlaluno

1
global $useruser_uid_optional_load () के समान नहीं है। पहला सत्र से भरा हुआ है और दूसरा पूरी तरह से भरी हुई उपयोगकर्ता वस्तु नहीं है (दूसरे के साथ फ़ील्ड और हुक के साथ)। इसलिए मैं इसे एक विकल्प के रूप में सूचीबद्ध नहीं करूंगा। उस फ़ंक्शन का उद्देश्य नामित मेनू तर्कों के लिए उपयोग किया जाता है जो उपयोगकर्ता आईडी को वैकल्पिक रूप से स्वीकार कर सकता है और अन्यथा वर्तमान उपयोगकर्ता के लिए डिफ़ॉल्ट हो सकता है। / उपयोगकर्ता / यूआईडी प्राथमिक उदाहरण है।
बर्दिर

@Berdir धन्यवाद मुझे पता नहीं था कि global $userयह पूरी तरह से डिफ़ॉल्ट रूप से लोड नहीं किया गया था (हालांकि यह समझ में आता है और कुछ चीजों की व्याख्या करता है जिन्हें मैं पहले आश्चर्यचकित करता था)। मैंने इसका उत्तर निकाल लिया है।
क्लाइव

धन्यवाद क्लाइव, मुझे लगता है कि यह वैश्विक $ उपयोगकर्ता का उपयोग कर रहा है और इसे $ खाता चर में कॉपी करना शायद सबसे सुरक्षित विकल्प है। मैं वास्तव में user_uid_optional_load () के लिए देख रहा था, हालांकि :)
एलेक्स वेबर

3

यह आपके कार्य के दायरे में (मौजूदा) वैश्विक $ उपयोगकर्ता ऑब्जेक्ट घोषित करने जितना आसान है:

global $user;

ध्यान रखें कि इस ऑब्जेक्ट में किए गए परिवर्तन इसे विश्व स्तर पर प्रभावित करते हैं, अर्थात

global $user;
$user->uid = 1;

बस वर्तमान उपयोगकर्ता को यूआईडी 1 विशेषाधिकार दिया। यही कारण है कि आम तौर पर $ उपयोगकर्ता को $ खाते में सौंपा जाता है ताकि डेटा को वर्तमान में उपयोगकर्ता में लॉग इन किए बिना प्रभावित किया जा सके (जब तक कि निश्चित रूप से, आप चाहते थे)।

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