In unserem vorherigen Projekt war die direkte Rückgabe einer Ansicht aus der POST-Anfrage bei fehlgeschlagener Validierung nicht der beste Ansatz.
Wenn ein Benutzer ein Anmeldeformular mit ungültigen Daten sendet, zeigt das Formular Fehlermeldungen an und leitet den Benutzer zur Anmeldeseite weiter. Wenn der Benutzer jedoch die Seite aktualisiert oder wegnavigiert und zur Anmeldeseite zurückkehrt, bleiben dieselben Fehlermeldungen bestehen.
Um dieses Problem zu beheben, können wir Sitzungen verwenden, um Fehler zu speichern und das PRG-Muster zu implementieren. Wir können Fehler in der superglobalen Variablen $_SESSION speichern und die Fehleranweisung in create.php wie folgt aktualisieren:
$_SESSION['errors'] = $form->errors(); view('session/create.view.php', [ 'errors' => $_SESSION['errors'] ?? [] ]);
Aber selbst mit dieser Änderung besteht das Problem weiterhin. Um dieses Problem zu lösen, müssen wir die Return-Anweisung wie folgt ändern:
return redirect ('/login');
l
Wenn ein Fehler aufgetreten ist, wird der Benutzer zur Anmeldeseite weitergeleitet, Benutzer w
wird der Fehler jedoch nicht angezeigt
Anschließend flashen wir die superglobale Variable $_SESSION, um die Sitzung nach kurzer Zeit zu zerstören:
$_SESSION['_flashed']['errors'] = $form->errors();
Jetzt können Sie feststellen, dass das Problem gelöst ist, aber um diesen Code umzugestalten, müssen wir die PRG-Methode in einer Klasse hinzufügen
Für die Umgestaltung erstellen wir eine neue Datei mit dem Namen Core/Session.php, die eine Session-Klasse enthält, die Benutzersitzungen verwaltet:
<?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']); } }
Durch die Verwendung dieser Sitzungsklasse können wir das PRG-Muster und das Sitzungs-Flashing implementieren, um Benutzersitzungen zu verwalten und doppelte Formularübermittlungen sowie unerwünschte Persistenz von Fehlermeldungen zu verhindern.
In dieser Datei gibt die Methode has einen booleschen Wert zurück, der angibt, ob in der Sitzung ein Schlüssel vorhanden ist:
. public static function has($key) { return (bool) static::get($key); }
In der Datei function.php überarbeiten wir die Abmeldefunktion, um die Session-Klasse zu verwenden:
Session::destroy();
Da das Projekt bereits gut funktioniert. Aber wir müssen die Get-Methode in Core/Session.php umgestalten, um den Code in einer einzigen Anweisung zu konsolidieren:
public static function get($key, $default = null) { return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default; }
In unserem heutigen Projekt wird viel Refactoring durchgeführt, um das Aussehen zu verbessern, es leichter zu verstehen und die Leistung des Codes zu steigern.
Ich hoffe, dass Sie es klar verstanden haben!.
Das obige ist der detaillierte Inhalt vonSitzungsbehandlung mit dem PRG-Muster und Flashing. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!