以前のプロジェクトでは、検証が失敗したときに POST リクエストから直接ビューを返すのは最良のアプローチではありませんでした。
ユーザーが無効なデータを含むログイン フォームを送信すると、フォームにエラー メッセージが表示され、ユーザーはログイン ページにリダイレクトされます。ただし、ユーザーがページを更新するか、別の場所に移動してログイン ページに戻ると、同じエラー メッセージが表示され続けます。
この問題を解決するには、セッションを使用してエラーを保存し、PRG パターンを実装します。 $_SESSION スーパーグローバル変数にエラーを保存し、create.php のエラー ステートメントを次のように更新できます。
$_SESSION['errors'] = $form->errors(); view('session/create.view.php', [ 'errors' => $_SESSION['errors'] ?? [] ]);
しかし、この変更があっても、問題は依然として残ります。これを解決するには、return ステートメントを次のように変更する必要があります:
return redirect ('/login');
エラーが発生した場合はユーザーをログイン ページに移動しますが、ユーザーにはエラーは表示されません w
次に、$_SESSION スーパーグローバル変数をフラッシュして、短時間後にセッションを破棄します。
$_SESSION['_flashed']['errors'] = $form->errors();
これで問題は解決したことがわかりますが、このコードをリファクタリングするにはクラスに PRG メソッドを追加する必要があります
リファクタリングのために、ユーザーセッションを管理する Session クラスを含む Core/Session.php という名前の新しいファイルを作成します。
<?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']); } }
この Session クラスを使用すると、PRG パターンとセッション フラッシュを実装してユーザー セッションを管理し、フォームの重複送信や不要なエラー メッセージの永続化を防ぐことができます。
このファイルでは、 has メソッドはセッションにキーが存在するかどうかを示すブール値を返します。
. public static function has($key) { return (bool) static::get($key); }
function.php ファイルで、Session クラスを使用するようにログアウト関数をリファクタリングします。
Session::destroy();
プロジェクトはすでに順調に進んでいます。ただし、Core/Session.php の get メソッドをリファクタリングして、コードを 1 つのステートメントに統合する必要があります。
public static function get($key, $default = null) { return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default; }
今日のプロジェクトでは、見た目を良くし、理解しやすくし、コードのパフォーマンスを向上させるために、多くのリファクタリングが行われています。
しっかりと理解していただけたと思います!
以上がPRG パターンとフラッシュによるセッション処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。