HTTP là không trạng thái, session cung cấp cách thức để lưu trữ thông tin về user xuyên qua các request. Laravel cung cấp nhiều cách thức lưu trữ session, hỗ trợ nhiều backend như Memcached, Redis, và database.
Cấu hình session trong Laravel:
File cấu hình config/session.php. Mặc định là file session driver. Nếu ứng dụng sử dụng load balanced thông qua nhiều webserver, bạn có thể sử dụng Redis hoặc database.
Các tùy chọn trong cấu hình:
file: lưu trữ session trongstorage/framework/sessions.cookie: sessions được lưu trữ trong cookie, được mã hóa.database: session được lưu trữ trong database.memcached–redis: session được lưu trữ trong bộ nhớ cache của các ứng dụng này.dynamodb: session được lưu trữ trong AWS DynamoDB.array: session được lưu trữ trong PHP array và sẽ không bền. Chỉ sử dụng cho testing.
Điều kiện cho driver:
Database:
Khi sử dụng database session, bạn cần tạo 1 table chứa các bản ghi session. Ví dụ Schema cho table:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity')->index();
});Bạn có thể sử dụng lệnh artisan session:table để tạo migration này:
php artisan session:table
php artisan migrateRedis:
Cài đặt PhpRedis extension.
Tương tác với session:
Truy xuất data:
Dùng session() hoặc thông qua instance Request:
class UserController extends Controller
{
public function show(Request $request, string $id): View
{
$value = $request->session()->get('key');
}
}Có thể pass default value để trả về nếu session key không tồn tại. Bạn có thể pass 1 closure:
$value = $request->session()->get('key', function() {
return 'default';
});Session helper:
$value = session('key');
$value = session('key', 'default');
// lưu trữ data vào session
session(['key' => 'value']);Truy xuất tất cả session:
$data = $request->session()->all();Xác minh 1 item có tồn tại:
if ($request->session()->has('user')) {
//
}Để kiểm tra 1 item có tồn tại kể cả khi giá trị của nó bằng null:
if ($request->session()->exists('users'))Kiểm tra 1 item không tồn tại:
if ($request->session()->missing('users'))Lưu trữ data:
$request->session()->put('key', 'value');
// or
session(['key' => 'value']);Lưu vào array session:
Method push sử dụng để lưu 1 giá trị mới vào 1 session là array. Ví dụ key user.teams chứa 1 array, bạn có thể add 1 giá trị mới vào array:
$request->session()->push('user.teams', 'developers');Truy xuất và xóa item đồng thời:
$value = $request->session()->pull('key', 'default');Tăng/giảm giá trị session:
$request->session()->increment('count');
$request->session()->increment('count', $incrementBy = 2);
$request->session()->decrement('count');
$request->session()->decrement('count', $decrementBy = 2);Flash data:
Thi thoảng bạn cần lưu data vào session cho request tiếp theo. Sử dụng method flash. Data lưu trữ trong session sẽ có sẵn trong suốt request tiếp theo. Sau request tiếp theo, data sẽ được xóa. Flash data hữu ích cho status message:
$request->session()->flash('status', 'Task was successful!');Xóa data:
Dùng method forget để xóa 1 item. Dùng flush để xóa hết data từ session:
$request->session()->forget('name');
$request->session()->forget(['name', 'status']);
$request->session()->flush();Khởi tạo lại session ID:
Sử dụng trong trường hợp ngăn chặn người dùng độc hại tấn công khai thác session fixation. Laravel tự động khởi tạo lại session ID trong quá trình xác thực (authentication) nếu bạn sử dụng starter kits hoặc Fortify. Bạn có thể khởi tạo lại bằng method regenerate:
$request->session()->regenerate();Khởi tạo lại và gỡ hết data từ session:
$request->session()->invalidate();Block session:
