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

WBOY
Libérer: 2024-07-18 21:46:21
original
365 Les gens l'ont consulté

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'] ?? [] ]);
Copier après la connexion

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

Copier après la connexion


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();
Copier après la connexion

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']);
    }
}
Copier après la connexion
  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);
}
Copier après la connexion

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();
Copier après la connexion

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;
}
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!