Зберігання даних / сеансу для анонімного користувача


12

Я працюю в магазині, а для кошика потрібно зберігати предмети перед оплатою.

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

Я ознайомлюсь із службою користувача щодо:

pivate_tempstore та shared_tempstore

Але це працює лише для аутентифікації користувачів.

Що я можу використовувати для зберігання даних? $ _СЕСІЯ? або Drupal 8 має службу для цього?


Я використовую файли cookie. У мене є ідентифікатор і хеш-cookie, які я перевіряю, а потім з'єдную ідентифікатор з тим, що мені потрібно. Я не використовую сеанси, оскільки D8 перестав їх використовувати і для анонімних користувачів.

Гаразд, і чому ви не використовуєте $ _SESSION?
Кевін

Відповіді:


11

У Drupal 8 змінні сеансу можна отримати за допомогою запиту:

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

Якщо ви хочете щось встановити на сеансі, ви можете зробити наступне:

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

Або отримати змінну сеансу:

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

1
я спробую, щоб ви могли зберігати масив?
Кевін

1
Так, ви можете зберігати масив, я змінив свій код, щоб узгодити з питанням, але мій насправді зберігає масив.
Данканму

3
Напружилися, щоб інші рішення працювали - це так просто і, здається, насправді працює
Нейт

як видалити змінну сеансу?
siddiq

Дякую, що працює чудово
Кевін

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

Цей підхід може бути кращим, оскільки він означає, що ви можете використовувати єдину систему для тимчасового зберігання, незалежно від того, чи користувач увійшов у систему.

(Мої приклади коду підняті більш-менш дослівно з цього чудового посібника зі створення багатошагових форм .)


Цікаво, я погляну на це, але мені подобається такий підхід
Кевін

Подивіться на це про те , як почати сеанс в Drupal 8 (пост beta6) drupal.org/node/2228871 . Можливо, нам слід переглянути 2-й фрагмент коду у відповіді.
David Riccitelli


3

Сеанс може бути анонімним (uid = 0). Ви можете просто використовувати $ _SESSION, і drupal подбає про це.

Зберігати дані сеансу:

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

Отримати дані сеансу:

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

Оновлення 1: Об'єкт сесії

Поки в ядрі D8 ще триває робота, див. Цю проблему Перетворення використання $ _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: TempStore

Схоже, TempStore дуже популярний у D8. Але занадто складно зберігати деякі значення, як у цьому питанні. Він призначений для великих фрагментів даних, наприклад, наприклад, для попереднього перегляду даних або збережених переглядів. Ось офіційні записи змін:

Доступ до даних сеансу через об’єкт Запит

API TempStore додано для постійного, тривалого зберігання даних, що не кешуються


так, сеанс може бути анонімним, але, мабуть, не для служби користувачів.
Кевін

У Drupal 8 найкраща практика передбачає, що ви повинні використовувати Інтерфейс для читання та запису даних до змінних сеансу. Це дозволяє зберігати місця, які можна замінити, і світліше майбутнє.
Джордж

1

Більше $this->sessionManager->start();не працював для мене через останнє оновлення. Я змінив його на$this->sessionManager->regenerate();


Ви повинні додати це як коментар до оригінальної відповіді, а не як нову відповідь
wranvaud

1
@wranvaud, у мене було недостатньо репутації, щоб можна було коментувати іншу відповідь.
Дан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.