Une plongée approfondie dans les sessions en Laravel
Découvrez comment fonctionnent les sessions dans Laravel, comment les utiliser pour stocker des données utilisateur et éviter les erreurs courantes.
Lorsque vous construisez des applications Laravel, vous devez, à un moment donné, travailler avec les sessions. Elles sont essentielles pour préserver les données utilisateur d'une requête à l'autre dans un contexte où les applications web sont par défaut sans état.
Dans cet article, nous allons explorer en détail ce que sont les sessions, comment elles fonctionnent dans Laravel, et comment les utiliser de manière optimale. Nous verrons aussi comment interagir avec elles via des "classes de session" pour éviter des erreurs fréquentes dans les applications Laravel.
1. Qu'est-ce qu'une session ?
En développement web, une session est un moyen sécurisé de conserver des données entre plusieurs requêtes HTTP. Comme les applications web sont stateless (sans état), chaque requête est indépendante des autres. Ainsi, pour conserver des informations comme l'état d'authentification ou des messages flash pour les utilisateurs, nous utilisons des sessions.
Les sessions permettent de stocker des informations importantes comme :
- L'état d'authentification des utilisateurs.
- Des données temporaires accessibles entre plusieurs pages.
- Des messages flash pour informer l'utilisateur.
Les données de session peuvent être stockées dans plusieurs endroits :
- Cookies : Les données sont stockées dans des cookies sécurisés et cryptés.
- Bases de données : Comme MySQL ou PostgreSQL.
- Cache stores : Comme Redis ou Memcached.
- DynamoDB : Si vous utilisez AWS.
- Fichiers : Les sessions sont stockées dans
storage/framework/sessions
. - Array : Les sessions sont stockées en mémoire PHP, non persistantes.
2. Comment fonctionnent les sessions dans Laravel ?
Laravel propose plusieurs drivers de sessions pour stocker les données selon vos besoins. Voici les plus courants :
- cookie : Les données sont stockées dans des cookies cryptés.
- database : Les sessions sont stockées dans une base de données relationnelle.
- redis / memcached : Les sessions sont stockées dans des caches rapides.
- file : Les sessions sont stockées dans des fichiers locaux.
- array : Les sessions sont stockées en mémoire vive PHP.
Voyons un exemple de données de session dans une application Laravel :
[
'_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW',
'_previous' => [
'url' => 'https://mon-app.com/utilisateurs'
],
'_flash' => [
'old' => ['success'],
'new' => []
],
'success' => 'Utilisateur créé avec succès.',
'current_team_id' => 123
]
Voici une explication rapide des différentes clés :
- _token : Utilisé pour protéger contre les attaques CSRF.
- _previous.url : Contient l'URL de la requête précédente.
- _flash : Conserve les données temporaires pour la requête suivante (ex : messages de succès).
- success : Un message de succès affiché à l'utilisateur.
- current_team_id : L'ID de l'équipe courante visualisée par l'utilisateur.
3. Interagir avec les sessions en Laravel
Laravel facilite énormément la gestion des sessions. Vous pouvez les lire, écrire, supprimer ou modifier les données de session via des méthodes simples. Voici un aperçu des opérations les plus courantes.
Lire des données de session
Pour lire une valeur dans la session, vous pouvez utiliser la méthode get
:
$currentStep = session()->get('wizard:current_step');
Si la clé n'existe pas, vous pouvez définir une valeur par défaut :
$currentStep = session()->get('wizard:current_step', 1);
Écrire des données dans la session
Pour ajouter ou mettre à jour des données dans la session, utilisez la méthode put
:
session()->put('wizard:step_one:form_data', [
'nom' => 'John Doe',
'email' => 'john@example.com',
]);
Ajouter à un tableau dans la session
La méthode push
permet d'ajouter des éléments à un tableau stocké dans la session :
session()->push('wizard:languages', 'javascript');
Incrémenter et décrémenter une valeur
Vous pouvez aussi incrémenter ou décrémenter une valeur dans la session :
session()->increment('wizard:current_step');
session()->decrement('wizard:current_step');
Supprimer des données de session
Pour retirer une clé de la session, utilisez forget
:
session()->forget('wizard:current_step');
Ou pour tout supprimer :
session()->flush();
4. Les "Session Classes" pour organiser votre code
Dans des projets de plus grande envergure, gérer les sessions directement dans les contrôleurs peut devenir difficile. Une bonne pratique consiste à créer des Session Classes pour encapsuler la logique liée à une fonctionnalité spécifique (par exemple, un formulaire en plusieurs étapes).
Voici un exemple d'une classe de session pour un assistant d'utilisateur :
namespace App\Sessions\Users;
class WizardSession
{
private const CURRENT_STEP = 'wizard:current_step';
public function getCurrentStep()
{
return session()->get(self::CURRENT_STEP, 1);
}
public function setCurrentStep($step)
{
session()->put(self::CURRENT_STEP, $step);
}
public function flush()
{
session()->forget([self::CURRENT_STEP]);
}
}
En encapsulant les interactions avec la session dans des classes dédiées, vous améliorez la maintenabilité et la testabilité de votre code.
5. Tester les sessions dans Laravel
Laravel offre une manière simple de tester les interactions avec les sessions via le framework de tests PHPUnit. Voici un exemple de test pour vérifier que les données de session sont correctement enregistrées :
public function testSessionData()
{
$this->withSession(['wizard:current_step' => 2])
->post('/wizard/next', ['name' => 'John Doe'])
->assertSessionHas('wizard:current_step', 3);
}
Ce test s'assure que la session est correctement modifiée après l'exécution d'une requête HTTP.
Conclusion
Les sessions sont une composante clé de toute application web, et Laravel propose des outils puissants et flexibles pour interagir avec elles. En adoptant les bonnes pratiques, comme l'utilisation de classes de session pour organiser vos données et éviter les erreurs, vous pouvez rendre vos applications plus robustes et plus maintenables à long terme.
Maîtriser la gestion des sessions dans Laravel vous aidera à mieux structurer vos applications et à garantir une expérience utilisateur plus fluide.