Memorizzazione di dati / sessione per utente anonimo


12

Sto lavorando in un negozio e, per il carrello, devo conservare gli articoli prima del pagamento.

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

Dò un'occhiata al servizio utenti per:

pivate_tempstore e shared_tempstore

Ma questo funziona solo per autenticare gli utenti.

Cosa posso usare per i dati del negozio? $ _SESSION? o Drupal 8 ha un servizio per questo?


Sto usando i cookie. Ho un identificatore e un cookie di hash che convalido e quindi associo l'identificatore a ciò di cui ho bisogno. Non uso sessioni perché D8 ha smesso di usarle anche per utenti anonimi.

Ok e perché non usi $ _SESSION?
Kevin,

Risposte:


11

In Drupal 8 è possibile accedere alle variabili di sessione dalla richiesta:

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

Se si desidera impostare qualcosa nella sessione, è possibile effettuare le seguenti operazioni:

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

O per recuperare una variabile di sessione:

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

1
lo proverò, in modo da poter memorizzare un array?
Kevin,

1
Sì, puoi archiviare un array, ho modificato il mio codice per allinearlo alla domanda, ma il mio sta effettivamente memorizzando un array.
Duncanmoo,

3
Lottato per far funzionare altre soluzioni - questo è così semplice e sembra funzionare davvero
Nate

come eliminare una variabile di sessione?
siddiq,

Grazie che funziona perfettamente
Kevin,

17

Risposta tardiva, ma vale la pena ricordare che è possibile utilizzare il tempstore privato per utenti anonimi, purché il tempstore abbia accesso a una sessione attiva. Per fare ciò, devi iniettare alla tua classe servizi per l'archivio temporaneo, la sessione e l'utente corrente, in questo modo:

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

Quindi devi solo assicurarti di avviare il gestore sessioni se l'utente è anonimo, prima di dover inserire qualsiasi cosa nell'archivio temporaneo:

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

Questo approccio potrebbe essere preferibile perché significa che è possibile utilizzare un singolo sistema per l'archiviazione temporanea, indipendentemente dal fatto che un utente abbia effettuato l'accesso.

(I miei esempi di codice sono sollevati più o meno alla lettera da questo eccellente tutorial sulla costruzione di moduli multi-step .)


Interessante, ci darò un'occhiata ma mi piace questo approccio
Kevin,

Dai un'occhiata a come iniziare una sessione in Drupal 8 (post beta6) drupal.org/node/2228871 . Forse dovremmo rivedere il 2 ° frammento di codice nella risposta.
David Riccitelli,


3

Una sessione può essere anonima (uid = 0). Puoi semplicemente usare $ _SESSION e drupal se ne occuperà.

Memorizza i dati della sessione:

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

Ottieni dati di sessione:

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

Aggiornamento 1: oggetto sessione

Mentre c'è ancora lavoro in corso nel core D8, vedi questo problema Converti gli usi di $ _SESSION nella sessione di symfony recuperata dalla richiesta , puoi usare l'oggetto sessione nella richiesta per memorizzare i dati della sessione. Ma non mescolarlo, i dati archiviati con uno di questi metodi non sono disponibili nell'altro. Vedi questa risposta per maggiori dettagli Drupal 8 e 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;
  }
}

Aggiornamento 2: TempStore

Il TempStore sembra essere molto popolare in D8. Ma è troppo complicato memorizzare alcuni valori come in questa domanda. È destinato a grandi blocchi di dati come ad esempio i dati di anteprima o le viste non salvate. Ecco i record ufficiali delle modifiche:

Accedi ai dati della sessione tramite l'oggetto Request

Aggiunta l'API TempStore per l'archiviazione persistente e duratura di dati non cache


Sì, la sessione può essere anonima ma apparentemente non per il servizio utente.
Kevin,

In Drupal 8 le migliori pratiche dettano che è necessario utilizzare un'interfaccia per leggere e scrivere i dati nelle variabili di sessione. Ciò consente la memorizzazione scambiabile e un futuro più luminoso.
George,

1

Il $this->sessionManager->start();non funzionava più per me, perché l'ultimo aggiornamento. L'ho cambiato in$this->sessionManager->regenerate();


Dovresti aggiungere questo come commento alla risposta originale piuttosto che come nuova risposta
wranvaud,

1
@wranvaud, non avevo abbastanza reputazione per poter commentare un'altra risposta.
Dan Poenaru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.