Skip to main content

什麼是 Session

HTTP 是無狀態的協定,本身沒有跨請求保留使用者資訊的機制。 Laravel 的 session 功能提供在多個請求之間保留使用者資料的方法。 登入狀態、購物車商品、表單輸入中的資料等,需在請求之間保留的資訊皆可存到 session。

Session Driver 的設定

Session 設定寫在 config/session.php。 可用 SESSION_DRIVER 環境變數(.env)切換 driver。
Laravel 標準支援的 driver 如下:
Laravel 預設專案已設定 database driver。使用 database driver 需要 sessions 資料表,但預設 migration 已包含,可直接使用。

Session 序列化

在 Laravel 13 的應用骨架中,config/session.php 已將 serialization 設為 json。不過框架的內部預設值仍為 php
將此設定從 php 變更為 json 會使所有作用中的使用者 session 失效。若 session 中儲存了 PHP 物件,也可能造成錯誤。
若希望在升級時保留作用中的 session,請明確設為 php。若應用不會在 session 中儲存 PHP 物件,且可接受要求使用者重新登入,則使用 json 可獲得更好的安全性。

存取 Session 的方法

存取 session 有兩種方式:透過 Request 實例的方法,或使用全域 helper session()

使用 Request 實例

在 controller 方法以 Request type-hint 接收,並用 $request->session() 存取 session。

使用全域 helper session()

session() helper 函式可在 controller、view 等任何位置呼叫。
兩種方式在測試時都能用 assertSessionHas 方法驗證。在 controller 中使用 $request->session() 可讓依賴更清楚。

Session 的操作

取得資料

檢查資料存在

請注意 hasexists 的差異:

儲存資料

刪除資料

Flash 資料

Flash 資料是僅在下一次請求有效的 session 資料。 用於表單送出完成訊息、錯誤訊息等只想顯示一次的資訊。

flash() 儲存資料

此資料在下次請求可讀取,之後會自動刪除。

延長 flash 資料

在 Blade 顯示 flash 訊息

Flash 訊息的顯示寫在 layout 檔案(如 layouts/app.blade.php),在所有頁面都能一致顯示。

實用範例:表單送出後的訊息顯示

送出表單後將成功訊息存到 session 並 redirect,在下個頁面顯示,是 Web 應用的常見模式。
1

定義路由

2

Controller 的實作

在接收表單送出的 store 方法中,儲存後附帶成功訊息 redirect。
redirect()->with('success', '...') 是將 flash 資料傳到 redirect 目的地的捷徑。
3

在 layout 顯示訊息

resources/views/layouts/app.blade.php 加入 flash 訊息的顯示部分。
4

建立列表頁的 view

文章儲存並 redirect 後,此列表頁的上方會顯示一次「已建立文章。」訊息。

與驗證錯誤結合的模式

驗證失敗時搭配 back()->withErrors() 使用。 Laravel 於驗證失敗時會自動將錯誤保留為 flash 資料,Blade 中可使用 $errors 變數。
flush() 會刪除 session 中所有資料。登入狀態也會遺失,若只想刪除使用者資料,請以 forget() 指定特定 key。

後續步驟

Validation

確認如何以 validation 驗證表單的輸入資料。
最後修改於 2026年8月21日