Speichern von Daten / Sitzungen für anonyme Benutzer

12

Ich arbeite an einem Geschäft und für den Einkaufswagen muss ich Artikel vor der Zahlung lagern.

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

Ich schaue im User Service nach:

pivate_tempstore und shared_tempstore

Dies funktioniert jedoch nur für authentifizierte Benutzer.

Was kann ich für Geschäftsdaten verwenden? $ _SESSION? oder hat Drupal 8 einen Service dafür?

Kevin
quelle
Ich benutze Cookies. Ich habe einen Bezeichner und ein Hash-Cookie, die ich validiere und dann den Bezeichner mit dem, was ich brauche, koppeln. Ich benutze keine Sessions, weil D8 sie auch nicht mehr für anonyme Benutzer verwendet.
Ok und warum benutzt du $ _SESSION nicht?
Kevin

Antworten:

11

In Drupal 8 kann auf die Sitzungsvariablen über die Anforderung zugegriffen werden:

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

Wenn Sie in der Sitzung etwas festlegen möchten, können Sie Folgendes tun:

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

Oder um eine Sitzungsvariable abzurufen:

$details = $session->get('profile');
Duncanmoo
quelle
1
Ich werde es versuchen, damit Sie ein Array speichern können?
Kevin
1
Ja, Sie können ein Array speichern. Ich habe meinen Code geändert, um ihn an der Frage auszurichten, aber ich speichere tatsächlich ein Array.
Duncanmoo
3
Mühte sich ab, andere Lösungen zum Laufen zu bringen - das ist so einfach und scheint tatsächlich zu funktionieren
Nate
Wie lösche ich eine Sitzungsvariable?
Siddiq
Vielen Dank, dass die Arbeit perfekt
Kevin
17

Späte Beantwortung, aber im Wert darauf zu erwähnen , dass Sie können Privat tempstore für anonyme Benutzer verwenden, solange die tempstore Zugang zu einer aktiven Sitzung hat. Dazu müssen Sie Ihrer Klasse Dienste für den temporären Speicher, die Sitzung und den aktuellen Benutzer hinzufügen.

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

Dann müssen Sie nur sicherstellen, dass Sie den Sitzungsmanager starten, wenn der Benutzer anonym ist, bevor Sie etwas in den temporären Speicher legen müssen:

if ($this->currentUser->isAnonymous() && !isset($_SESSION['session_started'])) {
    $_SESSION['session_started'] = true;
    $this->sessionManager->start();
}

Möglicherweise ist dieser Ansatz vorzuziehen, da Sie ein einzelnes System für die temporäre Speicherung verwenden können, unabhängig davon, ob ein Benutzer angemeldet ist.

(My Codebeispiele werden angehoben mehr oder weniger wörtlich aus diesen hervorragenden Tutorial auf dem Aufbau mehrstufiger Formen .)

Lyserge
quelle
Interessant, ich werde einen Blick darauf werfen, aber ich mag diesen Ansatz
Kevin
Sehen Sie sich an, wie Sie eine Sitzung in Drupal 8 (nach Beta6) starten . Drupal.org/node/2228871 . Vielleicht sollten wir das 2. Codefragment in der Antwort überarbeiten.
David Riccitelli
Siehe auch drupal.stackexchange.com/questions/163142/…
David Riccitelli
3

Eine Sitzung kann anonym sein (UID = 0). Sie können einfach $ _SESSION verwenden und Drupal kümmert sich darum.

Sitzungsdaten speichern:

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

Sitzungsdaten abrufen:

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

Update 1: Sitzungsobjekt

Während im D8-Kern noch Arbeiten ausgeführt werden, siehe dieses Problem Konvertieren von Verwendungen von $ _SESSION in Symfony-Sitzung, die aus der Anforderung abgerufen wurden. Sie können das Sitzungsobjekt in der Anforderung zum Speichern von Sitzungsdaten verwenden. Aber nicht mischen, Daten, die Sie mit einer dieser Methoden speichern, sind in der anderen nicht verfügbar. In dieser Antwort finden Sie weitere Informationen zu Drupal 8 und Sitzungsverwaltung :

class MymoduleSessionCounter {
  function increment(Request $request) {
    $session = $request->getSession();
    $value = $session->get('mymodule_count', 0);
    $session->set('mymodule_count', $value + 1);

    return $value;
  }
}

Update 2: TempStore

Der TempStore scheint in D8 sehr beliebt zu sein. Es ist jedoch zu kompliziert, einige Werte wie in dieser Frage zu speichern. Es ist für große Datenmengen wie zum Beispiel Vorschaudaten oder nicht gespeicherte Ansichten gedacht. Hier sind die offiziellen Änderungsnachweise:

Greifen Sie über das Request-Objekt auf Sitzungsdaten zu

Die TempStore-API wurde für die dauerhafte, ablaufende Speicherung von Nicht-Cache-Daten hinzugefügt

4k4
quelle
yes session kann anscheinend anonym sein aber nicht für den user service.
Kevin
In Drupal 8 empfiehlt es sich, ein Interface zum Lesen und Schreiben von Daten in Sitzungsvariablen zu verwenden. Dies ermöglicht austauschbaren Speicher und eine bessere Zukunft.
George
1

Das hat $this->sessionManager->start();bei mir wegen des letzten Updates nicht mehr funktioniert. Ich habe es in geändert$this->sessionManager->regenerate();

Dan Poenaru
quelle
Sie sollten dies als Kommentar zur ursprünglichen Antwort und nicht als neue Antwort
hinzufügen
1
@wranvaud, ich hatte nicht genug Ruf, um eine andere Antwort kommentieren zu können.
Dan Poenaru