বিশ্বব্যাপী চলক অ্যাক্সেস এড়ানো যে বর্তমান ব্যবহারকারী অবজেক্ট পেতে একটি ফাংশন আছে?


29

আমি সবসময় এই সাথে চলেছি global $user;। যাইহোক, আমি মনে করি অবদানযুক্ত মডিউলে এমন কিছু দেখেছি যা গ্লোবালটি ব্যবহার না করেই বর্তমান ব্যবহারকারী বস্তুটিকে ফিরিয়ে দিয়েছে $user

এই জাতীয় ফাংশনটি কি দ্রুপাল in কোরে বিদ্যমান, বা বর্তমান ব্যবহারকারী অবজেক্টটি পেতে বিশ্বব্যাপী ডি-ফ্যাক্টো সুপারিশকৃত উপায়টি ব্যবহার করছে?


আপনি কেবল বিশ্বব্যাপী ব্যবহারকারী কেন ব্যবহার করবেন না?
সাদলুলু

5
কোডটিতে পরে যদি অযত্নে পরিবর্তন করা হয় তবে গ্লোবাল $ ব্যবহারকারী ব্যবহার করে সম্ভাব্য অযাচিত আচরণ তৈরি করতে পারে।
অ্যালেক্স ওয়েবার

উত্তর:


22

আপনি যে ফাংশনটি ব্যবহার করতে পারবেন তা হ'ল ইউজার_উইড_অপশনাল_লোড () ; তর্ক ছাড়াই, এটি বর্তমানে লগ-ইন করা ব্যবহারকারীর জন্য ব্যবহারকারীর বস্তুটি প্রদান করে। এটি এখনও গ্লোবাল ব্যবহার করে $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.

ড্রুপাল 8-এ, আপনি \Drupal::currentUser()দ্রুপাল 7 এর সমতুল্য হওয়ার জন্য $GLOBALS['user']এবং এর \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())সমস্ত ক্ষেত্রের এপিআই ক্ষেত্রগুলির সাথে একটি সম্পূর্ণ লোডযুক্ত বস্তুটি পেতে স্থিতিশীল পদ্ধতিটি ব্যবহার করেন । সমস্ত ফলাফলের সাথে বৈশ্বিক পরিবর্তনশীলকে ওভাররাইড করার ঝুঁকি আর নেই।
ক্ষেত্রে আপনার বর্তমান ব্যবহারকারীর সাথে স্যুইচ করা দরকার, উদাহরণস্বরূপ, বেনামে ব্যবহারকারীর, আপনি ড্রুপাল 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'];

ড্রুপালে এটি করার কোনও আদর্শ উপায় বলে মনে হচ্ছে না। উদাহরণস্বরূপ আপনি যদি নোড মডিউলটি দেখেন তবে node_access_grants()ফাংশনটি এই কোডটি ব্যবহার করে:

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

যেখানে ফাইলের পরের কাজটি এটি node_access_view_all_nodes()ব্যবহার করে:

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

সহজ উত্তরটি হ'ল উভয়ই বৈধ। আমি মনে করি এর ব্যবহারটি $GLOBALSযাতে ব্যবহার করা যায় তবে চলচিত্রটি $userবর্তমান স্কোপে সক্রিয় না থাকে এবং তাই অযত্নের কল দিয়ে উদাহরণস্বরূপ, $user = NULLআরও ফাংশনটিতে ওভাররাইট করা যায় না। যদিও আমি তাতে ১০০% নই।


আমি জানি এবং আপনার শেষ বিবৃতিতে সম্মত তা thats।
সাদলুলু

1
global $user;ভেরিয়েবলটি একাধিকবার উল্লেখ করা হলে সাধারণত ব্যবহার করা $GLOBALS['user']উচিত এবং যখন ফাংশন কোডে এটি একবারে ব্যবহৃত হয় তখন ব্যবহার করা উচিত; এতে ড্রুপাল কোড স্থির নয়। global $user;প্রয়োজনীয় একটি ক্ষেত্রে রয়েছে : যখন drupal_alter()তৃতীয় পক্ষের মডিউলগুলি বর্তমানে সক্রিয় ব্যবহারকারীর পরিবর্তনের অনুমতি দেওয়ার জন্য ব্যবহারকারী অবজেক্টটি পাস করা হয় (যা আসলে দ্রুপালের বাস্তবায়িত কিছু নয়)।
কিমলালুনো

1
global $userব্যবহারকারী_উইড_অপশনাল_লোড () হিসাবে একই জিনিস নয়। প্রথমটি অধিবেশন থেকে লোড করা হয় এবং পুরোপুরি লোড হওয়া ব্যবহারকারী অবজেক্ট নয় (দ্বিতীয় ক্ষেত্রের সাথে ক্ষেত্র এবং হুকগুলি সহ)) সুতরাং আমি একটি বিকল্প হিসাবে এটি তালিকাবদ্ধ না। এই ফাংশনটির উদ্দেশ্যটি নামযুক্ত মেনু আর্গুমেন্টগুলির জন্য ব্যবহার করা হয় যা কোনও ব্যবহারকারী আইডি optionচ্ছিকভাবে গ্রহণ করতে পারে এবং অন্যথায় বর্তমান ব্যবহারকারীর কাছে ডিফল্ট। / ব্যবহারকারী / ইউআইডি প্রাথমিক উদাহরণ।
বারদির

@ বারডির ধন্যবাদ আমি জানতাম না যে এটি global $userসম্পূর্ণরূপে ডিফল্ট দ্বারা লোড করা হয়নি (যদিও এটি বোধগম্য হয় এবং বেশ কয়েকটি বিষয় যা আমি আগে ভাবতাম তা ব্যাখ্যা করে)। আমি উত্তরটি বাইরে নিয়ে এসেছি।
ক্লাইভ

ধন্যবাদ ক্লাইভ, আমি মনে করি গ্লোবাল $ ব্যবহারকারীর ব্যবহার করে এবং কোনও অ্যাকাউন্ট ভেরিয়েবলে অনুলিপি করা সম্ভবত সবচেয়ে নিরাপদ বিকল্প। আমি আসলে ব্যবহারকারী_উইড_অপশনাল_লোড () এর জন্য খুঁজছিলাম যদিও :)
অ্যালেক্স ওয়েবার

3

এটি আপনার ফাংশনের ক্ষেত্রের মধ্যে (বিদ্যমান) গ্লোবাল $ ব্যবহারকারী অবজেক্টটি ঘোষণার মতোই সহজ:

global $user;

মনে রাখবেন যে এই অবজেক্টে করা পরিবর্তনগুলি এটি বিশ্বব্যাপী, অর্থাৎ প্রভাবিত করে

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

সবেমাত্র বর্তমান ব্যবহারকারীকে 1 টি সুবিধা দিয়েছে। এ কারণেই সাধারণত $ ব্যবহারকারীকে $ অ্যাকাউন্টে বরাদ্দ করা হয় যাতে বর্তমানে লগ ইন হওয়া ব্যবহারকারীকে প্রভাবিত না করেই ডেটাটি টিনক করা যায় (যদি না, অবশ্যই আপনি চাইতেন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.