使用 PRG 模式和閃爍進行會話處理

WBOY
發布: 2024-07-18 21:46:21
原創
365 人瀏覽過

Session Handling with the PRG pattern and Flashing

在我們之前的專案中,驗證失敗時直接從 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 方法

會話類別(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']);
    }
}
登入後複製
  1. flash 方法將資料儲存在 $_SESSION['_flash'] 陣列中,用於會話刷新。
  2. get 方法檢查 $_SESSION['_flash'] 中是否有 flash 資料並回傳。如果沒有,則傳回常規會話資料或預設值。
  3. unflash 方法會取消設定閃爍的數據,使其僅可用於下一個請求。
  4. PRG 模式的實作方式是使用 put 方法在會話中儲存數據,重定向(例如,使用 return redirect('/login');),然後使用 get 方法在下一個請求中檢索資料。

透過使用這個 Session 類,我們可以實現 PRG 模式和會話閃爍來管理使用者會話並防止重複的表單提交和不需要的錯誤訊息持久化。

有方法

在此文件中,has 方法傳回布林值,指示會話中是否存在某個鍵:

. 

public static function has($key) {
    return (bool) static::get($key);
}
登入後複製

重構註銷功能

在function.php檔案中,我們重構註銷函數以使用Session類別:

Session::destroy();
登入後複製

重構 get 方法

由於專案已經運作良好。但我們需要重構 Core/Session.php 中的 get 方法,將程式碼合併到單一語句中:

public static function get($key, $default = null) {
    return $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $default;
}
登入後複製

我們今天的專案進行了大量重構,使其外觀更好,易於理解並提高程式碼的效能。

希望您已經清楚地理解了! .

以上是使用 PRG 模式和閃爍進行會話處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!