উত্তর:
$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
পরিষেবাটি অ্যাক্সেস করার চেষ্টা করা উচিত , নির্ভরতা ইনজেকশন (ডিআই) নামক একটি আদর্শ প্যাটার্নের মাধ্যমে:
<?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
এবং রক্ষণাবেক্ষণের ওভারহেডগুলি ব্যাপকভাবে হ্রাস করতে পারে) সহ সম্পূর্ণ বিচ্ছিন্নভাবে পরীক্ষা করার অনুমতি দেয় ।
তবে ডিআই খুব স্বজ্ঞাত নয় এবং এটি বুঝতে কিছুটা সময় নেয়। আপনি কীভাবে আপনার অবজেক্ট কনস্ট্রাক্টারে পরিষেবা পাবেন সেটি নির্ভর করে যে বস্তুটি আসলে ড্রুপালে রয়েছে যেমন প্লাগইনগুলি নিবন্ধিত পরিষেবাদি থেকে আলাদা আচরণ করে। ডু ডকসগুলিতে ড্রুপাল 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()
পদ্ধতি সম্পর্কে আরও তথ্য এই ব্লগপোস্টে উপলভ্য ।