Stockage de données / session pour un utilisateur anonyme

12

Je travaille sur une boutique et pour le panier, j'ai besoin de stocker des articles avant le paiement.

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

Je jette un œil sur le service utilisateur pour:

pivate_tempstore et shared_tempstore

Mais cela ne fonctionne que pour les utilisateurs authentifiés.

Que puis-je utiliser pour stocker des données? $ _SESSION? ou Drupal 8 a un service pour ça?

Kevin
la source
J'utilise des cookies. J'ai un identifiant et un cookie de hachage que je valide, puis j'associe l'identifiant à ce dont j'ai besoin. Je n'utilise pas les sessions car D8 a également cessé de les utiliser pour les utilisateurs anonymes.
Ok et pourquoi vous n'utilisez pas $ _SESSION?
Kevin

Réponses:

11

Dans Drupal 8, les variables de session sont accessibles depuis la demande:

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

Si vous souhaitez définir quelque chose dans la session, vous pouvez effectuer les opérations suivantes:

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

Ou pour récupérer une variable de session:

$details = $session->get('profile');
Duncanmoo
la source
1
je vais essayer, donc vous pouvez stocker un tableau?
Kevin
1
Oui, vous pouvez stocker un tableau, j'ai changé mon code pour l'aligner sur la question, mais le mien stocke en fait un tableau.
Duncanmoo
3
Nous avons eu du mal à faire fonctionner d'autres solutions - c'est si simple et semble fonctionner
Nate
comment supprimer une variable de session?
siddiq
Remerciez parfaitement ce travail
Kevin
17

Réponse tardive, mais il convient de mentionner que vous pouvez utiliser le magasin temporaire privé pour les utilisateurs anonymes, tant que le magasin temporaire a accès à une session active. Pour ce faire, vous devez injecter votre classe avec des services pour le magasin temporaire, la session et l'utilisateur actuel, comme suit:

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

Ensuite, vous devez simplement vous assurer de démarrer le gestionnaire de sessions si l'utilisateur est anonyme, avant de mettre quoi que ce soit dans le magasin temporaire:

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

Cette approche peut être préférable car elle signifie que vous pouvez utiliser un seul système pour le stockage temporaire, qu'un utilisateur soit connecté ou non.

(Mes exemples de code sont extraits plus ou moins textuellement de cet excellent didacticiel sur la création de formulaires en plusieurs étapes .)

lyserge
la source
Intéressant, je vais y jeter un coup d'œil mais j'aime cette approche
Kevin
Jetez un œil à cela sur la façon de démarrer une session dans Drupal 8 (post beta6) drupal.org/node/2228871 . Peut-être devrions-nous réviser le 2ème fragment de code dans la réponse.
David Riccitelli
Voir aussi drupal.stackexchange.com/questions/163142/…
David Riccitelli
3

Une session peut être anonyme (uid = 0). Vous pouvez simplement utiliser $ _SESSION et drupal s'en chargera.

Stocker les données de session:

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

Obtenez les données de session:

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

Mise à jour 1: objet de session

Bien qu'il y ait encore du travail en cours dans le noyau D8, consultez ce problème Convertir les utilisations de $ _SESSION en session symfony récupérée de la demande , vous pouvez utiliser l'objet de session dans la demande pour stocker les données de session. Mais ne le mélangez pas, les données que vous stockez avec l'une de ces méthodes ne sont pas disponibles dans l'autre. Voir cette réponse pour plus de détails sur Drupal 8 et la gestion de session :

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

    return $value;
  }
}

Mise à jour 2: TempStore

Le TempStore semble être très populaire en D8. Mais c'est trop compliqué de stocker des valeurs comme dans cette question. Il est destiné à de gros morceaux de données comme par exemple des données d'aperçu ou des vues non enregistrées. Voici les enregistrements des changements officiels:

Accéder aux données de session via l'objet Request

API TempStore ajoutée pour le stockage persistant et expirable des données non-cache

4k4
la source
oui la session peut être anonyme mais pas pour le service utilisateur apparemment.
Kevin
Dans Drupal 8, la meilleure pratique dicterait que vous devez utiliser une interface pour lire et écrire des données dans des variables de session. Cela permet un stockage échangeable et un avenir meilleur.
George
1

Le $this->sessionManager->start();ne fonctionnait plus pour moi à cause de la dernière mise à jour. Je l'ai changé en$this->sessionManager->regenerate();

Dan Poenaru
la source
Vous devez ajouter ceci comme un commentaire à la réponse originale plutôt que comme une nouvelle réponse
wranvaud
1
@wranvaud, je n'avais pas assez de réputation pour pouvoir commenter une autre réponse.
Dan Poenaru