আমি বর্তমানে লগ ইন থাকা ব্যবহারকারীর জন্য কীভাবে ব্যবহারকারীর আইডি পেতে পারি?


31

আমি ড্রুপাল 8 এ বর্তমান ব্যবহারকারীর অবজেক্ট (ব্যবহারকারীর তথ্য) পেতে চাই।

আমি জানি ড্রুপাল 7 এ একটি বৈশ্বিক $userপরিবর্তনশীল ছিল; আমি কীভাবে ড্রুপাল 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পরিষেবাটি অ্যাক্সেস করার চেষ্টা করা উচিত , নির্ভরতা ইনজেকশন (ডিআই) নামক একটি আদর্শ প্যাটার্নের মাধ্যমে:

<?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()পদ্ধতি সম্পর্কে আরও তথ্য এই ব্লগপোস্টে উপলভ্য ।

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