Maison  >  Article  >  développement back-end  >  Gestion de session avec le modèle PRG et le clignotement

Gestion de session avec le modèle PRG et le clignotement

WBOY
WBOYoriginal
2024-07-18 21:46:21402parcourir

Session Handling with the PRG pattern and Flashing

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.

Le problème

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.

La solution

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

La classe de session (modèle PRG)

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']);
    }
}
  1. La méthode flash stocke les données dans le tableau $_SESSION['_flash'], qui est utilisé pour le flashage de session.
  2. La méthode get vérifie s'il y a des données flashées dans $_SESSION['_flash'] et les renvoie. Sinon, il renvoie les données de session normales ou la valeur par défaut.
  3. La méthode unflash désactive les données flashées, les rendant disponibles uniquement pour la prochaine requête.
  4. Le modèle PRG est implémenté en stockant les données dans la session à l'aide de la méthode put, en les redirigeant (par exemple, en utilisant return redirect('/login');), puis en récupérant les données dans la requête suivante à l'aide de la méthode get.

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.

a une méthode

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

Refactoriser la fonction de déconnexion

Dans le fichier function.php, nous refactorisons la fonction de déconnexion pour utiliser la classe Session :

Session::destroy();

Refactoriser la méthode get

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn