」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 PRG 模式和閃爍進行會話處理

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

發佈於2024-08-05
瀏覽:779

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

返回重定向('/login');




如果發生任何錯誤,它會將使用者移至登入頁面,但不會向使用者顯示錯誤 w
然後我們刷新 $_SESSION 超全域變數以在短時間內銷毀會話:

return redirect ('/login');

$_SESSION['_flashed']['errors'] = $form->errors();

現在您可以注意到問題已解決,但要重構此程式碼,我們必須在類別中新增 PRG 方法

會話類別(PRG 模式)


為了重構,我們建立一個名為 Core/Session.php 的新文件,其中包含管理使用者會話的 Session 類別:

return redirect ('/login');

  • flash方法將資料儲存在$_SESSION['_flash']陣列中,用於會話刷新。
  • get方法檢查$_SESSION['_flash']中是否有flash資料並回傳。如果沒有,則傳回常規會話資料或預設值。
  • unflash 方法取消設定刷新的數據,使其僅可用於下一個請求。
  • PRG 模式的實作方式是使用 put 方法在會話中儲存數據,重定向(例如,使用 return redirect('/login');),然後使用 get 方法在下一個請求中檢索資料。

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

    有方法


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

    return redirect ('/login');
    
    
    。 公共靜態函數 has($key) { return (bool) static::get($key); }

    重構註銷功能


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

    return redirect ('/login');
    
    
    會話::銷毀();

    重構 get 方法


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

    return redirect ('/login');
    
    
    公共靜態函數 get($key, $default = null) { 返回 $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $預設值; }

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

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

    版本聲明 本文轉載於:https://dev.to/ghulam_mujtaba_247/session-handling-with-the-prg-pattern-and-flashing-1jog?1如有侵犯,請聯絡[email protected]刪除
    最新教學 更多>
    • 哪種在JavaScript中聲明多個變量的方法更可維護?
      哪種在JavaScript中聲明多個變量的方法更可維護?
      在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
      程式設計 發佈於2025-04-01
    • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
      為什麼使用Firefox後退按鈕時JavaScript執行停止?
      導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
      程式設計 發佈於2025-04-01
    • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
      eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
      稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的python功能eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。 This article delves into the differences betwee...
      程式設計 發佈於2025-04-01
    • 如何檢查對像是否具有Python中的特定屬性?
      如何檢查對像是否具有Python中的特定屬性?
      方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError: SomeClass...
      程式設計 發佈於2025-04-01
    • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
      為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
      查詢模式實現缺失:解決“無法找到”錯誤在銀光應用程序中,嘗試使用LINQ建立錯誤的數據庫連接的嘗試,無法找到以查詢模式的實現。 ”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例中,tblpersoon可能...
      程式設計 發佈於2025-04-01
    • 如何使用Regex在PHP中有效地提取括號內的文本
      如何使用Regex在PHP中有效地提取括號內的文本
      php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
      程式設計 發佈於2025-04-01
    • 如何使用“ JSON”軟件包解析JSON陣列?
      如何使用“ JSON”軟件包解析JSON陣列?
      parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
      程式設計 發佈於2025-04-01
    • 如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
      如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
      Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
      程式設計 發佈於2025-04-01
    • 如何在JavaScript對像中動態設置鍵?
      如何在JavaScript對像中動態設置鍵?
      在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
      程式設計 發佈於2025-04-01
    • 如何在php中使用捲髮發送原始帖子請求?
      如何在php中使用捲髮發送原始帖子請求?
      如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
      程式設計 發佈於2025-04-01
    • 您如何在Laravel Blade模板中定義變量?
      您如何在Laravel Blade模板中定義變量?
      在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
      程式設計 發佈於2025-04-01
    • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
      找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
      如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
      程式設計 發佈於2025-04-01
    • 如何使用組在MySQL中旋轉數據?
      如何使用組在MySQL中旋轉數據?
      在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
      程式設計 發佈於2025-04-01
    • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
      為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
      使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
      程式設計 發佈於2025-04-01
    • HTML格式標籤
      HTML格式標籤
      HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
      程式設計 發佈於2025-04-01

    免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

    Copyright© 2022 湘ICP备2022001581号-3