বেনামে ব্যবহারকারীর জন্য ডেটা / সেশন সংরক্ষণ করা


12

আমি একটি দোকানে কাজ করছি, এবং কার্টের জন্য, অর্থ প্রদানের আগে আমার আইটেমগুলি সংরক্ষণ করতে হবে।

  $tempstore = \Drupal::service('user.private_tempstore')->get('boutique');
  $tempstore->set('poids', $form_state->getValue('poids'));

আমি এর জন্য ব্যবহারকারীর পরিষেবাটি একবার দেখি:

পিভেট_টেম্পস্টোর এবং শেয়ারড_স্টেমস্টোর

তবে এটি কেবল ব্যবহারকারীদের প্রমাণীকরণের জন্য।

স্টোর ডেটার জন্য আমি কী ব্যবহার করতে পারি? $ _সেসিশন? বা দ্রুপাল 8 এর জন্য কোনও পরিষেবা আছে?


আমি কুকি ব্যবহার করছি। আমার শনাক্তকারী এবং হ্যাশ কুকি রয়েছে যা আমি যাচাই করি এবং তারপরে আমার যা প্রয়োজন তা যুক্ত করে শনাক্তকারীর সাথে যুক্ত করুন। আমি সেশনগুলি ব্যবহার করি না কারণ ডি 8 অজ্ঞাতনামা ব্যবহারকারীদের জন্য তাদের ব্যবহার বন্ধ করে দিয়েছে।

ঠিক আছে এবং আপনি কেন _S _SESSION ব্যবহার করবেন না?
কেভিন

উত্তর:


11

ড্রুপাল 8 এ সেশন ভেরিয়েবলগুলি অনুরোধটি থেকে অ্যাক্সেস করা যায়:

$session = \Drupal::request()->getSession();

আপনি যদি সেশনে কিছু সেট করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:

$profile = 'Person';
$session->set('profile', $profile);

অথবা একটি সেশন ভেরিয়েবল পুনরুদ্ধার করতে:

$details = $session->get('profile');

1
আমি এটি দিয়ে চেষ্টা করব, যাতে আপনি একটি অ্যারে সঞ্চয় করতে পারেন?
কেভিন

1
হ্যাঁ আপনি একটি অ্যারে সঞ্চয় করতে পারেন, আমি প্রশ্নের সাথে একত্রিত করার জন্য আমার কোডটি পরিবর্তন করেছি, তবে আমার আসলে একটি অ্যারে সঞ্চয় করছে।
ডানকানমু

3
অন্যান্য সমাধানগুলি কাজ করার জন্য সংগ্রাম করা - এটি এত সহজ এবং বাস্তবে এটি কাজ করে বলে মনে হচ্ছে
Nate

কিভাবে একটি সেশন ভেরিয়েবল মুছবেন?
সিদ্দিক

পুরোপুরিভাবে সেই কাজের ধন্যবাদ
কেভিন

17

দেরিতে উত্তর দেওয়া, তবে এটি উল্লেখ করার মতো যে আপনি অজ্ঞাতনামা ব্যবহারকারীদের জন্য ব্যক্তিগত টেম্পস্টোরটি ব্যবহার করতে পারবেন , যতক্ষণ না টেম্পোরস্টোরটিতে একটি সক্রিয় সেশনে অ্যাক্সেস থাকে। এটি করার জন্য, আপনাকে টেম্প স্টোর, সেশন এবং বর্তমান ব্যবহারকারীর জন্য পরিষেবা সহ আপনার ক্লাসটি ইনজেক্ট করতে হবে:

public function __construct(PrivateTempStoreFactory $temp_store_factory, SessionManagerInterface $session_manager, AccountInterface $current_user) {
    $this->tempStoreFactory = $temp_store_factory;
    $this->sessionManager = $session_manager;
    $this->currentUser = $current_user;

    $this->store = $this->tempStoreFactory->get('myclass.storename');
}

public static function create(ContainerInterface $container) {
    return new static(
        $container->get('user.private_tempstore'),
        $container->get('session_manager'),
        $container->get('current_user')
    );
}

তারপরে আপনার কেবলমাত্র টেম্প স্টোরটিতে কিছু রাখার আগে ব্যবহারকারী বেনামে থাকলে আপনি সেশন ম্যানেজারটি শুরু করে তা নিশ্চিত করতে হবে:

if ($this->currentUser->isAnonymous() && !isset($_SESSION['session_started'])) {
    $_SESSION['session_started'] = true;
    $this->sessionManager->start();
}

আপনি এই পদ্ধতির পছন্দনীয় হতে পারেন কারণ এর অর্থ হ'ল কোনও ব্যবহারকারী লগ ইন করেছেন কিনা তা বিবেচনা না করেই আপনি অস্থায়ী স্টোরেজের জন্য একটি একক সিস্টেম ব্যবহার করতে পারেন।

(আমার কোড উদাহরণগুলি মাল্টি-স্টেপ ফর্মগুলি তৈরির এই দুর্দান্ত টিউটোরিয়াল থেকে কম-বেশি-কম ভারব্যাটিকাম তোলা হয়েছে ))


আকর্ষণীয়, আমি এটি একবার দেখে নেব তবে আমি এই পদ্ধতির পছন্দ করি
কেভিন

কিভাবে Drupal এর 8 (পোস্টে beta6) একটি সেশন শুরু করতে এই কটাক্ষপাত drupal.org/node/2228871 । হয়তো আমাদের উত্তরে ২ য় কোড খণ্ডটি সংশোধন করা উচিত।
ডেভিড রিক্সিটেলি


3

একটি অধিবেশন বেনামে থাকতে পারে (uid = 0)। আপনি কেবল $ _SESSION ব্যবহার করতে পারেন এবং ড্রুপাল এটির যত্ন নেবে।

সেশন ডেটা সঞ্চয় করুন:

$_SESSION['mymodule']['variablename'] = $tempdata;

সেশন ডেটা পান:

$tempdata = $_SESSION['mymodule']['variablename'];

আপডেট 1: সেশন অবজেক্ট

ডি 8 কোরটিতে এখনও কাজ চলছে, এই সমস্যাটি দেখুন অনুরোধ থেকে পুনরুদ্ধার করা সিম্ফনি সেশনটির জন্য $ _SESSION এর ব্যবহারগুলি রূপান্তর করুন , আপনি সেশন ডেটা সংরক্ষণ করার অনুরোধে সেশন অবজেক্টটি ব্যবহার করতে পারেন। তবে এটি মিশ্রণ করবেন না, এই পদ্ধতির একটির সাথে আপনি যে ডেটা সঞ্চয় করেন সেটি অন্যটিতে পাওয়া যায় না। আরও তথ্যের জন্য এই উত্তরটি দেখুন দ্রুপাল 8 এবং সেশন ম্যানেজমেন্ট :

class MymoduleSessionCounter {
  function increment(Request $request) {
    $session = $request->getSession();
    $value = $session->get('mymodule_count', 0);
    $session->set('mymodule_count', $value + 1);

    return $value;
  }
}

আপডেট 2: টেম্পস্টোর

টেম্পোর স্টোরটি ডি 8-তে খুব জনপ্রিয় বলে মনে হচ্ছে। তবে এই প্রশ্নের মতো কিছু মান সংরক্ষণ করা খুব জটিল। এটি উদাহরণস্বরূপ প্রাকদর্শন ডেটা বা সংরক্ষিত ভিউগুলির মতো ডেটা বড় অংশগুলির জন্য উদ্দিষ্ট। এখানে সরকারী পরিবর্তন রেকর্ড রয়েছে:

অনুরোধ অবজেক্টের মাধ্যমে সেশন ডেটা অ্যাক্সেস করুন

টেম্পস্টোর এপিআই অ-ক্যাশে ডেটার অবিচ্ছিন্ন, মেয়াদোত্তীর্ণ স্টোরেজ জন্য যুক্ত করা হয়েছে


হ্যাঁ সেশনটি বেনামে থাকতে পারে তবে ব্যবহারকারী পরিষেবার জন্য দৃশ্যত নয়।
কেভিন

ড্রুপাল 8-তে সেরা অনুশীলন হ'ল নির্দেশ করে যে আপনার সেশন ভেরিয়েবলগুলিতে ডেটা পড়তে এবং লেখার জন্য একটি ইন্টারফেস ব্যবহার করা উচিত। এটি অদলবদল স্টোরেজ এবং একটি উজ্জ্বল ভবিষ্যতের অনুমতি দেয়।
জর্জ

1

$this->sessionManager->start();সর্বশেষ আপডেট কারণে আমার জন্য আর কাজ করছে না হয়। আমি এটিকে পরিবর্তন করেছিলাম$this->sessionManager->regenerate();


আপনার নতুন উত্তর হিসাবে বরং মূল উত্তরের মন্তব্য হিসাবে এটি যুক্ত করা উচিত
wranvaud

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