Skip to content

HTTP Session

Giới thiệu (Introduction)

Vì HTTP driven applications là stateless, sessions cung cấp cách lưu thông tin user qua nhiều requests. Laravel hỗ trợ nhiều session backends thông qua API thống nhất.

Cấu hình (Configuration)

File cấu hình session tại config/session.php. Mặc định, Laravel dùng driver database.

Các session drivers có sẵn:

DriverMô tả
fileSessions lưu trong storage/framework/sessions
cookieSessions lưu trong cookies mã hóa
databaseSessions lưu trong database (mặc định)
memcached / redisSessions lưu trong cache stores
dynamodbSessions lưu trong AWS DynamoDB
arraySessions lưu trong PHP array (không persist, dùng cho testing)

Yêu cầu Driver (Driver Prerequisites)

Database

Khi dùng driver database, bảng sessions đã được tạo sẵn. Nếu chưa có:

bash
php artisan make:session-table
php artisan migrate

Redis

Cài package predis/predis hoặc extension phpredis. Cấu hình Redis connection trong config/database.php.

Tương tác với Session (Interacting With the Session)

Lấy dữ liệu (Retrieving Data)

Hai cách chính: session() helper hoặc qua Request instance:

php
// Qua Request
$value = $request->session()->get('key');
$value = $request->session()->get('key', 'default');

// Qua global helper
$value = session('key');
$value = session('key', 'default');

Lấy tất cả Session Data

php
$data = $request->session()->all();

Kiểm tra item tồn tại

php
if ($request->session()->has('users')) {
    // Tồn tại và không null...
}

if ($request->session()->exists('users')) {
    // Tồn tại (có thể null)...
}

if ($request->session()->missing('users')) {
    // Không tồn tại...
}

Lưu dữ liệu (Storing Data)

php
// Qua Request instance
$request->session()->put('key', 'value');

// Qua global helper
session(['key' => 'value']);

Push vào Array Session

php
$request->session()->push('user.teams', 'developers');

Lấy và xóa (Retrieving & Deleting)

php
$value = $request->session()->pull('key', 'default');

Tăng / Giảm giá trị

php
$request->session()->increment('count');
$request->session()->increment('count', $incrementBy = 2);
$request->session()->decrement('count');

Flash Data

Lưu data chỉ cho request tiếp theo:

php
$request->session()->flash('status', 'Tác vụ thành công!');

Giữ flash data thêm request nữa:

php
$request->session()->reflash();
$request->session()->keep(['username', 'email']);

Xóa dữ liệu (Deleting Data)

php
$request->session()->forget('name');
$request->session()->forget(['name', 'status']);

// Xóa tất cả
$request->session()->flush();

Regenerate Session ID

Thường thực hiện tự động khi authentication. Nếu cần thủ công:

php
$request->session()->regenerate();

// Regenerate và xóa tất cả data
$request->session()->invalidate();

Session Cache

Hỗ trợ cache nhúng trong session database:

env
SESSION_DRIVER=database

Truy cập session cache:

php
use Illuminate\Support\Facades\Session;

$value = Session::cache()->get('key');
Session::cache()->put('key', 'value', $seconds);

Session Blocking

Mặc định, Laravel cho phép requests cùng session chạy đồng thời. Session blocking giới hạn concurrent requests:

php
Route::post('/order', function () {
    // ...
})->block($lockSeconds = 10, $waitSeconds = 10);

Route::post('/order', function () {
    // ...
})->block();  // Mặc định lock 10 giây, wait 10 giây

Thêm Custom Session Drivers

Implement Driver

Implement interface SessionHandlerInterface:

php
<?php

namespace App\Extensions;

class MongoSessionHandler implements \SessionHandlerInterface
{
    public function open($savePath, $sessionName) {}
    public function close() {}
    public function read($sessionId) {}
    public function write($sessionId, $data) {}
    public function destroy($sessionId) {}
    public function gc($lifetime) {}
}

Đăng ký Driver

php
<?php

namespace App\Providers;

use App\Extensions\MongoSessionHandler;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        Session::extend('mongo', function ($app) {
            return new MongoSessionHandler;
        });
    }
}