web-dev-qa-db-fra.com

Stockage de données / session pour un utilisateur anonyme

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?

13
Kevin

Dans Drupal 8 les variables de session sont accessibles depuis la requête:

$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');
11
Duncanmoo

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 tutoriel sur la création de formulaires en plusieurs étapes .)

18
lyserge

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

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 Drupal 8 et 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

3
4k4

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

1
Dan Poenaru