Maison > Article > développement back-end > Gestion de session avec le modèle PRG et le clignotement
Dans notre projet précédent, renvoyer une vue directement à partir de la requête POST lorsque la validation échouait n'était pas la meilleure approche.
Lorsqu'un utilisateur soumet un formulaire de connexion avec des données non valides, le formulaire affiche des messages d'erreur et redirige l'utilisateur vers la page de connexion. Cependant, si l'utilisateur actualise la page ou s'éloigne et revient à la page de connexion, les mêmes messages d'erreur persistent.
Pour résoudre ce problème, nous pouvons utiliser des sessions pour stocker les erreurs et implémenter le modèle PRG. Nous pouvons stocker les erreurs dans la variable superglobale $_SESSION et mettre à jour l'instruction d'erreurs dans create.php comme :
$_SESSION['errors'] = $form->errors(); view('session/create.view.php', [ 'errors' => $_SESSION['errors'] ?? [] ]);
Mais même avec ce changement, le problème persiste. Pour résoudre ce problème, nous devons modifier l'instruction return comme :
return redirect ('/login');
l
Il déplace l'utilisateur vers la page de connexion si une erreur s'est produite, mais n'affiche pas l'erreur à l'utilisateur w
On flashe ensuite la variable superglobale $_SESSION pour détruire la session après un court instant :
$_SESSION['_flashed']['errors'] = $form->errors();
Vous pouvez maintenant remarquer que le problème est résolu mais pour refactoriser ce code nous devons ajouter la méthode PRG dans une classe
Pour le refactoring, nous créons un nouveau fichier nommé Core/Session.php contenant une classe Session qui gère les sessions utilisateur :
<?php namespace Core; class Session { public static function has($key) { return (bool) static::get($key); } public static function put($key, $value) { $_SESSION[$key] = $value; } public static function get($key, $default = null) { return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default; } public static function flash($key, $value) { $_SESSION['_flash'][$key] = $value; } public static function unflash() { unset($_SESSION['_flash']); } public static function flush() { $_SESSION = []; } public static function destroy() { static::flush(); session_destroy(); $params = session_get_cookie_params(); setcookie('PHPSESSID', '', time() - 3600, $params['path'], $params['domain'], $params['secure'], $params['httponly']); } }
En utilisant cette classe Session, nous pouvons implémenter le modèle PRG et le flashage de session pour gérer les sessions utilisateur et empêcher les soumissions de formulaires en double et la persistance indésirable des messages d'erreur.
Dans ce fichier, la méthode has renvoie une valeur booléenne indiquant si une clé existe dans la session :
. public static function has($key) { return (bool) static::get($key); }
Dans le fichier function.php, nous refactorisons la fonction de déconnexion pour utiliser la classe Session :
Session::destroy();
Comme le projet fonctionne déjà bien. Mais nous devons refactoriser la méthode get dans Core/Session.php pour consolider le code en une seule instruction :
public static function get($key, $default = null) { return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default; }
De nombreuses refactorisations sont effectuées dans notre projet d'aujourd'hui pour le rendre meilleur en apparence, facile à comprendre et pour augmenter les performances du code.
J'espère que vous l'avez bien compris !.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!