iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
佛心分享-IT 人自學之術

後端小白自學 Laravel系列 第 25

第 25 天:數據存儲與處理 Session

  • 分享至 

  • xImage
  •  

參考文章:[Web] Cookie & Session 介紹
文件:会话

第 17 天:緩存 Cache主要用快取來儲存臨時的數據,從而減少資料庫查詢的次數和提高回應速度。
今天要介紹的是前後端的儲存數據功能:瀏覽器的儲存方法 vs 伺服器的儲存方法

  • Laravel Session: 伺服器端的儲存機制,用於安全地管理使用者會話數據,適用於儲存需要伺服器端處理和保護的敏感資料。
  • 瀏覽器儲存: 客戶端的儲存機制,適用於儲存不需要高安全性的數據,如使用者設定和快取資訊。

會話的概念


會話 Session 是一種在使用者與伺服器之間保持狀態的機制,它使得伺服器能夠記住使用者的某些訊息,跨多個請求或頁面保持資料的持久性。

基本概念

  • 會話:伺服器端儲存使用者資料的一種機制,資料通常包括使用者的登入狀態、購物車內容等。
  • 會話識別碼:會話通常由一個唯一的識別碼,就像 Cookie 中的 session_id 可以用來追蹤,客戶端透過這個標識符與伺服器進行通信,伺服器根據標識符查找對應的會話資料。

配置和使用會話功能


在 Laravel 中,會話配置和使用可以透過設定檔來定義會話的儲存驅動、過期時間等,並在控制器中進行資料的儲存和存取。

配置會話

  • config/session.php 設定檔中,可以設定會話的相關選項:
    • 驅動 (driver):定義會話資料的儲存方式。可選值包括 file, cookie, database, redis, memcached, array
    • 過期時間 (lifetime):會話的過期時間(分鐘)。
    • 加密 (secure):指定是否使用 HTTPS 傳輸會話 Cookie。
    • 域名 (domain):Cookie 的域名。
  • 常見會話儲存驅動
    • 檔案 (file):預設驅動,資料儲存在 storage/framework/sessions 目錄中,適用於中小型應用,簡單易用。
    • Cookie (cookie):將會話資料直接儲存在客戶端的 Cookie 中,適合儲存少量資料。
    • 資料庫 (database):會話資料儲存在資料庫中。需要建立一個會話資料表。適合需要持久化資料的應用。
    • Redis (redis):會話資料儲存在 Redis 資料庫中。適用於高效能、高並發的場景。
    • Memcached (memcached):會話資料儲存在 Memcached 中。適用於高效能、高並發的場景。
    • 數組 (array):資料儲存在 PHP 數組中,只適用於請求週期內的資料存儲,不適合持久化。
// config/session.php
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => 120, // Session lifetime in minutes

使用會話
在控制器中使用會話資料:

  • 將資料儲存到會話
    public function store(Request $request)
    {
        $request->session()->put('key', 'value');
        return redirect()->back()->with('status', 'Data stored in session!');
    }
    
  • 讀取會話資料
    public function show(Request $request)
    {
        $value = $request->session()->get('key', 'default');
        return view('show', ['value' => $value]);
    }
    
  • 刪除會話資料
    // 刪除特定會話項
    public function destroy(Request $request)
    {
        $request->session()->forget('key');
        return redirect()->back()->with('status', 'Session data deleted!');
    }
    
    // 刪除所有會話數據
    public function clear(Request $request)
    {
        $request->session()->flush();
        return redirect()->back()->with('status', 'All session data cleared!');
    }
    

實際操作和範例


依照文件的範例:使用者登入功能

  1. 儲存用戶登入狀態:
    // 在登入控制器中儲存用戶登入狀態
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');
        if (Auth::attempt($credentials)) {
            $request->session()->put('user', Auth::user());
            return redirect()->intended('dashboard');
        }
        return redirect('login')->withErrors(['error' => 'Invalid credentials']);
    }
    
  2. 讀取用戶資訊:
    // 在控制器中讀取使用者資訊
    public function dashboard(Request $request)
    {
        $user = $request->session()->get('user');
        return view('dashboard', ['user' => $user]);
    }
    
  3. 登出功能:
    // 在登出控制器中
    public function logout(Request $request)
    {
        Auth::logout();
        $request->session()->flush();
        return redirect('login')->with('status', 'Logged out successfully!');
    }
    

✍🏻 每日任務:


第 11 天:用戶認證的每週任務是使用者登入認證。
透過這個認證試著用會話儲存他們的登入狀態,並在整個會話中使用它來顯示歡迎訊息。

step 1 - 配置會話
config/session.php 設定驅動。
(預設情況下,Laravel 使用檔案驅動來儲存會話資料。)

// config/session.php
'driver' => env('SESSION_DRIVER', 'file'),

確認 .env 檔案中的 SESSION_DRIVER 設定。

SESSION_DRIVER=file

step 2 - 建立登入表單

<!-- resources/views/auth/login.blade.php -->
<form action="{{ route('login') }}" method="POST">
    @csrf
    <input type="text" name="username" placeholder="Username" required>
    <input type="password" name="password" placeholder="Password" required>
    <button type="submit">Login</button>
</form>

step 3 - 處理登入請求

// app/Http/Controllers/AuthController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    public function showLoginForm()
    {
        return view('auth.login');
    }

    public function login(Request $request)
    {
        $credentials = $request->only('username', 'password');
        
        if (Auth::attempt($credentials)) {
            // 登入成功,將使用者 ID 儲存到會話中
            $request->session()->put('user_id', Auth::id());

            return redirect()->intended('dashboard');
        }

        return redirect()->back()->withErrors(['login' => 'Invalid credentials']);
    }

    public function logout(Request $request)
    {
        Auth::logout();
        $request->session()->flush(); // 清空會話數據
        return redirect('/');
    }
}

step 4 - 存取會話數據
在應用的其他地方,存取會話資料。例如,在顯示使用者歡迎訊息的控制器中:

// app/Http/Controllers/DashboardController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class DashboardController extends Controller
{
    public function index(Request $request)
    {
        $userId = $request->session()->get('user_id');
        
        // 取得使用者資訊(假設有一個 User 模型)
        $user = \App\Models\User::find($userId);
        
        return view('dashboard', ['user' => $user]);
    }
}

step 5 - 顯示會話數據

<!-- resources/views/dashboard.blade.php -->
<h1>Welcome, {{ $user->name }}</h1>
<form action="{{ route('logout') }}" method="POST">
    @csrf
    <button type="submit">Logout</button>
</form>

上一篇
第 24 天:項目重構與優化
下一篇
第 26 天:多語言支持
系列文
後端小白自學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言