Pracuję w sklepie, a do koszyka muszę przechowywać przedmioty przed dokonaniem płatności.
$tempstore = \Drupal::service('user.private_tempstore')->get('boutique');
$tempstore->set('poids', $form_state->getValue('poids'));
Patrzę na usługę użytkownika dla:
pivate_tempstore i shared_tempstore
Ale to działa tylko w przypadku uwierzytelnienia użytkowników.
Czego mogę użyć do przechowywania danych? $ _SESSION? czy Drupal 8 ma na to usługę?
Odpowiedzi:
W Drupal 8 do zmiennych sesji można uzyskać dostęp poza żądaniem:
Jeśli chcesz ustawić coś w sesji, możesz wykonać następujące czynności:
Lub, aby pobrać zmienną sesji:
źródło
Późne odpowiadanie, ale warto wspomnieć, że możesz korzystać z prywatnej przechowalni danych dla anonimowych użytkowników, o ile będzie ona mieć dostęp do aktywnej sesji. Aby to zrobić, musisz wstrzyknąć swojej klasie usługi dla magazynu tymczasowego, sesji i bieżącego użytkownika, takie jak:
Musisz tylko upewnić się, że uruchamiasz menedżera sesji, jeśli użytkownik jest anonimowy, zanim będziesz musiał umieścić cokolwiek w magazynie tymczasowym:
Takie podejście może być preferowane, ponieważ oznacza, że możesz użyć jednego systemu do tymczasowego przechowywania, niezależnie od tego, czy użytkownik jest zalogowany.
(Moje przykłady kodu są mniej więcej dosłownie z tego doskonałego samouczka na temat budowania formularzy wieloetapowych ).
źródło
Sesja może być anonimowa (uid = 0). Możesz po prostu użyć $ _SESSION, a Drupal zajmie się tym.
Przechowuj dane sesji:
Uzyskaj dane sesji:
Aktualizacja 1: Obiekt sesji
Chociaż w rdzeniu D8 nadal trwają prace, zobacz ten problem Konwertuj zastosowania $ _SESSION na sesję symfony pobraną z żądania , możesz użyć obiektu sesji w żądaniu do przechowywania danych sesji. Ale nie mieszaj tego, dane przechowywane za pomocą jednej z tych metod nie są dostępne w drugiej. Zobacz tę odpowiedź, aby uzyskać więcej informacji Drupal 8 i zarządzanie sesjami :
Aktualizacja 2: TempStore
TempStore wydaje się być bardzo popularny w D8. Ale przechowywanie niektórych wartości jak w tym pytaniu jest zbyt skomplikowane. Jest przeznaczony do dużych fragmentów danych, takich jak na przykład podgląd danych lub niezapisane widoki. Oto oficjalne zapisy zmian:
Uzyskaj dostęp do danych sesji za pośrednictwem obiektu Request
Dodano interfejs API TempStore do trwałego, przewidywalnego przechowywania danych bez pamięci podręcznej
źródło
To
$this->sessionManager->start();
nie działało już dla mnie z powodu ostatniej aktualizacji. Zmieniłem to na$this->sessionManager->regenerate();
źródło