在我們之前的專案中,驗證失敗時直接從 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 方法
為了重構,我們建立一個名為 Core/Session.php 的新文件,其中包含管理使用者會話的 Session 類別:
<?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 方法,將程式碼合併到單一語句中:
public static function get($key, $default = null) { return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default; }
我們今天的專案進行了大量重構,使其外觀更好,易於理解並提高程式碼的效能。
希望您已經清楚地理解了! .
以上是使用 PRG 模式和閃爍進行會話處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!