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


12

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

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

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

pivate_tempstore и shared_tempstore

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

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


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

Хорошо, а почему вы не используете $ _SESSION?
— Кевин

Ответы:


11

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

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

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

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

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

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

1
Я попробую, чтобы вы могли хранить массив?
— Кевин

1
Да, вы можете хранить массив, я изменил свой код, чтобы привести его в соответствие с вопросом, но мой фактически хранит массив.
— Дунканму


как удалить переменную сеанса?
— Сиддик

Спасибо, что работа отлично
— Кевин

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 (пост бета6) drupal.org/node/2228871 . Возможно, нам следует пересмотреть второй фрагмент кода в ответе.
— Дэвид Риччелли


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


Да, сессия может быть анонимной, но, по-видимому, не для пользовательского сервиса.
— Кевин

В Drupal 8 передовой опыт предписывает использовать интерфейс для чтения и записи данных в переменные сеанса. Это позволяет заменять хранилище и светлое будущее.
— Джордж

1

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


Вы должны добавить это как комментарий к оригинальному ответу, а не как новый ответ
— wranvaud

1
@wranvaud, у меня не было достаточно репутации, чтобы комментировать другой ответ.
— Дэн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.