Я работаю в магазине, и для корзины мне нужно хранить товары до оплаты.
$tempstore = \Drupal::service('user.private_tempstore')->get('boutique');
$tempstore->set('poids', $form_state->getValue('poids'));
Я смотрю на пользовательский сервис для:
pivate_tempstore и shared_tempstore
Но это работает только для аутентификации пользователей.
Что я могу использовать для хранения данных? $ _SESSION? или у Drupal 8 есть сервис для этого?
Ответы:
В Drupal 8 переменные сеанса могут быть доступны из запроса:
Если вы хотите установить что-то в сеансе, вы можете сделать следующее:
Или получить переменную сеанса:
источник
Поздний ответ, но стоит упомянуть, что вы можете использовать приватное временное хранилище для анонимных пользователей, если временное хранилище имеет доступ к активному сеансу. Для этого вам нужно внедрить в ваш класс сервисы для временного хранилища, сеанса и текущего пользователя, например:
Тогда вам просто нужно убедиться, что вы запустили диспетчер сеансов, если пользователь анонимный, прежде чем вам нужно что-то поместить во временное хранилище:
Этот подход может оказаться предпочтительным, поскольку он означает, что вы можете использовать одну систему для временного хранения независимо от того, вошел ли пользователь в систему.
(Мои примеры кода более или менее дословно взяты из этого превосходного руководства по созданию многошаговых форм .)
источник
Сессия может быть анонимной (uid = 0). Вы можете просто использовать $ _SESSION, и drupal позаботится об этом.
Сохранить данные сеанса:
Получить данные сеанса:
Обновление 1: объект сеанса
Хотя в ядре D8 все еще продолжается работа, см. Эту проблему. Преобразуйте использование $ _SESSION в сеанс symfony, полученный из запроса , вы можете использовать объект сеанса в запросе для хранения данных сеанса. Но не перепутайте, данные, которые вы храните одним из этих методов, недоступны в другом. Посмотрите этот ответ для более подробной информации Drupal 8 и Session Management :
Обновление 2: TempStore
TempStore, кажется, очень популярен в D8. Но слишком сложно хранить некоторые значения, как в этом вопросе. Он предназначен для больших порций данных, таких как, например, данные предварительного просмотра или несохраненные представления. Вот официальные записи изменений:
Доступ к данным сеанса через объект запроса
API TempStore добавлен для постоянного, истекающего хранения данных вне кеша
источник
The
$this->sessionManager->start();
больше не работал для меня из-за последнего обновления. Я изменил это в$this->sessionManager->regenerate();
источник