Хранение данных / сеанс для анонимного пользователя

12

Я работаю в магазине, и для корзины мне нужно хранить товары до оплаты.

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

Я смотрю на пользовательский сервис для:

pivate_tempstore и shared_tempstore

Но это работает только для аутентификации пользователей.

Что я могу использовать для хранения данных? $ _SESSION? или у Drupal 8 есть сервис для этого?

Kevin
источник
Я использую куки. У меня есть идентификатор и хеш-файл cookie, который я проверяю, а затем связываю идентификатор с тем, что мне нужно. Я не использую сессии, потому что D8 прекратил использовать их также для анонимных пользователей.
Хорошо, а почему вы не используете $ _SESSION?
Кевин

Ответы:

11

В Drupal 8 переменные сеанса могут быть доступны из запроса:

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

Если вы хотите установить что-то в сеансе, вы можете сделать следующее:

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

Или получить переменную сеанса:

$details = $session->get('profile');
Duncanmoo
источник
1
Я попробую, чтобы вы могли хранить массив?
Кевин
1
Да, вы можете хранить массив, я изменил свой код, чтобы привести его в соответствие с вопросом, но мой фактически хранит массив.
Дунканму
3
Нейт
как удалить переменную сеанса?
Сиддик
Спасибо, что работа отлично
Кевин
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();
}

Этот подход может оказаться предпочтительным, поскольку он означает, что вы можете использовать одну систему для временного хранения независимо от того, вошел ли пользователь в систему.

(Мои примеры кода более или менее дословно взяты из этого превосходного руководства по созданию многошаговых форм .)

lyserge
источник
Интересно, я посмотрю на это, но мне нравится этот подход
Кевин
Посмотрите на это, как начать сеанс в Drupal 8 (пост бета6) drupal.org/node/2228871 . Возможно, нам следует пересмотреть второй фрагмент кода в ответе.
Дэвид Риччелли
См. Также drupal.stackexchange.com/questions/163142/…
Дэвид Риччелли
3

Сессия может быть анонимной (uid = 0). Вы можете просто использовать $ _SESSION, и drupal позаботится об этом.

Сохранить данные сеанса:

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

Получить данные сеанса:

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

Обновление 1: объект сеанса

Хотя в ядре D8 все еще продолжается работа, см. Эту проблему. Преобразуйте использование $ _SESSION в сеанс symfony, полученный из запроса , вы можете использовать объект сеанса в запросе для хранения данных сеанса. Но не перепутайте, данные, которые вы храните одним из этих методов, недоступны в другом. Посмотрите этот ответ для более подробной информации Drupal 8 и Session Management :

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 добавлен для постоянного, истекающего хранения данных вне кеша

4k4
источник
Да, сессия может быть анонимной, но, по-видимому, не для пользовательского сервиса.
Кевин
В Drupal 8 передовой опыт предписывает использовать интерфейс для чтения и записи данных в переменные сеанса. Это позволяет заменять хранилище и светлое будущее.
Джордж
1

The $this->sessionManager->start();больше не работал для меня из-за последнего обновления. Я изменил это в$this->sessionManager->regenerate();

Дэн Поэнару
источник
Вы должны добавить это как комментарий к оригинальному ответу, а не как новый ответ
wranvaud
1
@wranvaud, у меня не было достаточно репутации, чтобы комментировать другой ответ.
Дэн