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 的方法

存取 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月2日