Laravel Session là cơ chế giúp ứng dụng lưu trữ dữ liệu giữa nhiều HTTP request của cùng một người dùng. Vì HTTP vốn hoạt động theo từng request độc lập, Session giúp Laravel ghi nhớ những thông tin cần thiết trong suốt một phiên làm việc. Session thường được sử dụng để lưu trạng thái đăng nhập, thông báo tạm thời, thông tin giỏ hàng, bộ lọc hoặc những dữ liệu cần duy trì qua nhiều request.
Laravel Session là gì?
Laravel Session là cơ chế quản lý dữ liệu phiên làm việc được Laravel cung cấp để ứng dụng có thể lưu và truy xuất thông tin giữa các request.
Ví dụ, người dùng đăng nhập:
Request 1
↓
Đăng nhập thành công
↓
Lưu thông tin vào Session
↓
Request 2
↓
Laravel đọc Session
↓
Biết người dùng đã đăng nhập
Nếu không có Session hoặc một cơ chế lưu trạng thái tương tự, mỗi request mới sẽ không tự biết những gì đã xảy ra ở request trước.
Session thường được sử dụng cho:
- Trạng thái đăng nhập.
- Thông báo thành công hoặc lỗi.
- Giỏ hàng.
- Bộ lọc tìm kiếm.
- Dữ liệu tạm thời giữa các trang.
- Thông tin trạng thái của người dùng.
Cấu hình Session trong Laravel
Cấu hình Session nằm tại: config/session.php
Một trong những thiết lập quan trọng là:
‘driver’ => env(‘SESSION_DRIVER’, ‘database’),
Giá trị thực tế phụ thuộc vào phiên bản Laravel và cấu hình .env của project.
Một số session driver phổ biến gồm:
- file
- cookie
- database
- redis
- memcached
- array
Khi mới làm quen với Laravel, việc hiểu Session cùng với Cookie, Authentication và Request sẽ giúp bạn hình dung rõ hơn cách framework duy trì trạng thái giữa các lần truy cập. Bạn có thể tham khảo thêm các kiến thức về Laravel cơ bản để nắm nền tảng trước khi đi sâu vào các cơ chế này.
Cách lưu dữ liệu vào Session
Laravel cung cấp nhiều cách để ghi dữ liệu vào Session.
Sử dụng session()
Cách đơn giản: session([‘username’ => ‘admin’]);
Sau đó có thể lấy lại: $username = session(‘username’);
Sử dụng put()
Bạn cũng có thể thao tác thông qua Session: $request->session()->put(‘username’, ‘admin’);
Cách này thường xuất hiện khi đang làm việc trực tiếp với đối tượng Request.
Lưu nhiều giá trị
$request->session()->put([
‘username’ => ‘admin’,
‘role’ => ‘editor’,
]);
Session lúc này có thể chứa nhiều key khác nhau:
username → admin
role → editor
Lấy dữ liệu từ Session
Để lấy một giá trị: $username = session(‘username’);
Có thể cung cấp giá trị mặc định nếu key không tồn tại: $username = session(‘username’, ‘guest’);
Hoặc sử dụng Request: $username = $request->session()->get(‘username’);
Để lấy toàn bộ dữ liệu Session: $data = $request->session()->all();
Tuy nhiên, trong code thực tế nên lấy đúng những dữ liệu cần thiết thay vì phụ thuộc quá nhiều vào toàn bộ Session.
Kiểm tra dữ liệu có tồn tại
Laravel hỗ trợ kiểm tra Session bằng has():
if ($request->session()->has(‘username’)) {
// Session tồn tại
}
Nếu muốn kiểm tra key tồn tại và giá trị không phải null, có thể sử dụng:
$request->session()->exists(‘username’);
Ngoài ra còn có missing() để kiểm tra một key không tồn tại:
if ($request->session()->missing(‘username’)) {
// Chưa có dữ liệu
}
Xóa dữ liệu Session
Để xóa một key:
$request->session()->forget(‘username’);
Xóa nhiều key:
$request->session()->forget([
‘username’,
‘role’,
]);
Nếu muốn xóa toàn bộ dữ liệu Session:
$request->session()->flush();
flush() cần được sử dụng cẩn thận vì nó xóa toàn bộ dữ liệu Session hiện tại.
Các Session Driver phổ biến
File
Driver file lưu Session vào filesystem của ứng dụng.
Đây là lựa chọn tương đối đơn giản cho môi trường phát triển hoặc những ứng dụng có quy mô vừa phải.
Ưu điểm:
- Dễ thiết lập.
- Không cần thêm hệ thống lưu trữ bên ngoài.
- Phù hợp để phát triển local.
Hạn chế là khi triển khai nhiều server, việc quản lý Session cần được thiết kế phù hợp để các instance có thể chia sẻ trạng thái.
Database
Database driver lưu Session vào cơ sở dữ liệu.
Cách này phù hợp khi muốn quản lý Session tập trung trong database.
Ví dụ cấu hình:
SESSION_DRIVER=database
Sau đó cần chuẩn bị bảng Session theo yêu cầu của phiên bản Laravel đang sử dụng.
Redis
Redis có tốc độ truy cập nhanh và phù hợp với các hệ thống có lượng request lớn.
Ví dụ:
SESSION_DRIVER=redis
Tuy nhiên, Redis cần được cài đặt và cấu hình riêng cho môi trường ứng dụng.
Cookie
Cookie driver lưu dữ liệu Session trong cookie được mã hóa.
Do dữ liệu nằm trong cookie nên cần cân nhắc kích thước dữ liệu. Session không nên trở thành nơi chứa lượng thông tin lớn.
Array
array driver thường hữu ích cho testing vì dữ liệu Session chỉ tồn tại trong request hiện tại và không được lưu lâu dài.
Nếu đang xây dựng ứng dụng thực tế, tham khảo thêm các kiến thức tại Học Laravel, cùng với việc kết hợp giữa Request, Session, Middleware và Authentication sẽ giúp tránh việc học từng thành phần một cách rời rạc.
Session nên lưu những dữ liệu nào?
Session phù hợp với dữ liệu:
- Nhỏ.
- Tạm thời.
- Liên quan đến trạng thái người dùng.
- Cần sử dụng giữa nhiều request.
Ví dụ:
$request->session()->put(‘cart_count’, 3);
Hoặc:
$request->session()->put(‘checkout_step’, 2);
Không nên sử dụng Session để lưu:
- File lớn.
- Dữ liệu có kích thước rất lớn.
- Dữ liệu cần truy vấn phức tạp.
- Toàn bộ object hoặc dữ liệu database không cần thiết.
Với dữ liệu lớn hoặc cần lưu trữ lâu dài, database hoặc hệ thống lưu trữ chuyên dụng thường phù hợp hơn.
Kết luận
Laravel Session là cơ chế quan trọng giúp ứng dụng duy trì trạng thái giữa nhiều HTTP request.
Những điểm cần nhớ:
- Session giúp lưu dữ liệu giữa các request.
- Laravel hỗ trợ nhiều session driver như file, database, Redis, cookie và array.
- Có thể đọc, ghi, kiểm tra và xóa dữ liệu Session bằng nhiều phương thức.
- Flash Session phù hợp với thông báo tạm thời.
- Session thường kết hợp với Authentication để duy trì trạng thái đăng nhập.
- Không nên lưu dữ liệu quá lớn hoặc business data lâu dài trong Session.
- Cần chú ý Session ID và regenerate Session trong các luồng xác thực.
Hiểu rõ Session sẽ giúp bạn xử lý tốt hơn các chức năng như đăng nhập, giỏ hàng, thông báo, redirect và trạng thái người dùng trong ứng dụng Laravel.
