अनाम उपयोगकर्ता के लिए डेटा / सत्र संग्रहीत करना


12

मैं एक दुकान पर काम कर रहा हूं, और गाड़ी के लिए, मुझे भुगतान से पहले वस्तुओं को स्टोर करना होगा।

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

मैं इसके लिए उपयोगकर्ता सेवा पर एक नज़र डालता हूं:

pize_tempstore और साझा_tempstore

लेकिन यह केवल उपयोगकर्ताओं को प्रमाणित करने के लिए काम करता है।

स्टोर डेटा के लिए मैं क्या उपयोग कर सकता हूं? $ _SIONION? या Drupal 8 के लिए एक सेवा है?


मैं कुकीज़ का उपयोग कर रहा हूं। मेरे पास पहचानकर्ता और हैश कुकी है जिसे मैं मान्य करता हूं और फिर पहचानकर्ता को मेरी आवश्यकता के साथ जोड़ देता है। मैं सत्रों का उपयोग नहीं करता हूं क्योंकि D8 ने अनाम उपयोगकर्ताओं के लिए भी उनका उपयोग करना बंद कर दिया है।

ठीक है और आप $ _SESSION का उपयोग क्यों नहीं करते हैं?
केविन

जवाबों:


11

Drupal 8 में सत्र चर को अनुरोध से एक्सेस किया जा सकता है:

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

यदि आप सत्र में कुछ सेट करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:

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

या एक सत्र चर प्राप्त करने के लिए:

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

1
मैं इसे एक कोशिश करूँगा, ताकि आप एक सरणी स्टोर कर सकें?
केविन

1
हां, आप एक सरणी स्टोर कर सकते हैं, मैंने प्रश्न के साथ संरेखित करने के लिए अपना कोड बदल दिया है, लेकिन मेरा वास्तव में एक सरणी का भंडारण है।
डंकनमो सेप

3
काम कर रहे अन्य समाधान प्राप्त करने के लिए संघर्ष - यह बहुत सरल है और वास्तव में काम करने के लिए लगता है
नैट

सत्र चर को कैसे हटाएं?
सिद्दीक

उस काम को पूरी तरह से धन्यवाद
केविन

18

उत्तर देने में देर हो गई, लेकिन यह ध्यान देने योग्य है कि आप अनाम उपयोगकर्ताओं के लिए निजी टेम्पोस्टोर का उपयोग कर सकते हैं, जब तक कि टेम्पोरोर के पास सक्रिय सत्र तक पहुंच हो। ऐसा करने के लिए, आपको अपनी कक्षा को अस्थायी स्टोर, सत्र और वर्तमान उपयोगकर्ता के लिए सेवाओं के साथ इंजेक्ट करने की आवश्यकता है, जैसे:

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();
}

आपको यह दृष्टिकोण बेहतर लग सकता है क्योंकि इसका मतलब है कि आप अस्थायी संग्रहण के लिए एकल प्रणाली का उपयोग कर सकते हैं, भले ही कोई उपयोगकर्ता लॉग इन हो।

( बहु-चरण रूपों के निर्माण पर इस उत्कृष्ट ट्यूटोरियल से मेरे कोड उदाहरणों को अधिक-या-कम शब्दशः हटा दिया जाता है ।)


दिलचस्प है, मैं इस पर एक नज़र डालूँगा, लेकिन मुझे यह तरीका पसंद है
केविन

इस पर एक नज़र डालें कि ड्रुपल 8 (पोस्ट बीटा 6) drupal.org/node/222831 में सत्र कैसे शुरू करें । हो सकता है कि हमें उत्तर में दूसरे कोड के टुकड़े को संशोधित करना चाहिए।
डेविड रिक्सेटली


3

एक सत्र अनाम हो सकता है (uid = 0)। आप बस $ _SESSION का उपयोग कर सकते हैं और ड्रुपल इस बात का ध्यान रखेगा।

स्टोर सत्र डेटा:

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

सत्र डेटा प्राप्त करें:

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

अद्यतन 1: सत्र वस्तु

हालांकि डी 8 कोर में अभी भी काम चल रहा है, इस मुद्दे को अनुरोध से प्राप्त सिम्फनी सत्र में $ _SESSION के कन्वर्ट का उपयोग करें , आप सत्र डेटा को संग्रहीत करने के लिए अनुरोध में सत्र ऑब्जेक्ट का उपयोग कर सकते हैं। लेकिन इसे मिक्स न करें, आपके द्वारा इनमें से किसी एक विधि के साथ संग्रहीत डेटा दूसरे में उपलब्ध नहीं है। अधिक विवरण Drupal 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: अस्थायी

D8 में TempStore बहुत लोकप्रिय लगता है। लेकिन इस प्रश्न में कुछ मूल्यों को संग्रहीत करना बहुत जटिल है। यह डेटा के बड़े हिस्से के लिए है जैसे उदाहरण पूर्वावलोकन डेटा या बिना सहेजे गए दृश्य। यहाँ आधिकारिक परिवर्तन रिकॉर्ड हैं:

अनुरोध ऑब्जेक्ट के माध्यम से सत्र डेटा एक्सेस करें

TempStore एपीआई गैर-कैश डेटा के लगातार, उचित भंडारण के लिए जोड़ा गया


हां सत्र गुमनाम हो सकता है लेकिन उपयोगकर्ता सेवा के लिए स्पष्ट रूप से नहीं।
केविन

Drupal 8 में सबसे अच्छा अभ्यास यह निर्धारित करेगा कि आपको सत्र चर के डेटा को पढ़ने और लिखने के लिए एक इंटरफ़ेस का उपयोग करना चाहिए। यह swappable भंडारण और एक उज्जवल भविष्य के लिए अनुमति देता है।
जॉर्ज

1

$this->sessionManager->start();अंतिम अद्यतन की वजह से मेरे लिए अब और काम नहीं कर रहा था। मैंने इसे में बदल दिया$this->sessionManager->regenerate();


आपको इसे नए उत्तर के बजाय मूल उत्तर के लिए एक टिप्पणी के रूप में जोड़ना चाहिए
wranvaud

1
@ श्रवण, मेरे पास इतनी प्रतिष्ठा नहीं थी कि मैं दूसरे उत्तर पर टिप्पणी कर सकूं।
डैन पोनेरू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.