Giao diện
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:
| Driver | Mô tả |
|---|---|
file | Sessions lưu trong storage/framework/sessions |
cookie | Sessions lưu trong cookies mã hóa |
database | Sessions lưu trong database (mặc định) |
memcached / redis | Sessions lưu trong cache stores |
dynamodb | Sessions lưu trong AWS DynamoDB |
array | Sessions 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 migrateRedis
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=databaseTruy 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âyThê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;
});
}
}