Như các bạn đã biết, HTTP là một mô hình không trạng thái, session
đóng vai trò lưu trữ lại thông tin các request để các request
tiếp theo có thể truy xuất thông tin được.
Laravel hỗ trợ rất mạnh về session
và việc sử dụng cũng rất đơn giản. Trong Laravel bạn có thể sử dụng session
qua database
, file
, MemCached
, Redis
,…
1. Cấu hình Session
Bạn có thể cấu hình session trong file config/session.php
Mặc định Laravel sẽ lưu trữ session bằng file, nhưng nếu như ứng dụng của bạn sửa dụng load balance thì cần config session qua Redis, hoặc database để các worker có thể connect được đồng thời
Laravel hỗ trợ chúng ta một số session driver như sau:
file
– session sẽ được lưu trữ lạistorage/framework/sessions
(các bạn có thể thay đổi được thư mục).cookie
– sessions sẽ được lưu trữ vào cookie và sẽ được mã hóa an toàn trước khi lưu vào cookie.database
– sessions sẽ được lưu trữ vào database.memcached
/redis
– session sẽ được lưu trữ vào trong bộ nhớ cache của các ứng dụng này.dynamodb
– session sẽ được lưu trữ vào trong AWS DynamoDB.array
– session sẽ được lưu trữ vào một array trong PHP. Driver này chỉ nên dùng cho testing.
Ngoài ra các thông số trong config/session.php
sẽ có ý nghĩa như sau:
lifetime
– thời gian sống của session, tính bằng đơn vị phút.expire_on_close
– session sẽ được xóa khi người dùng đóng trình duyệt.encrypt
– có mã hóa session trước khi lưu trữ không?files
– path sẽ lưu trữ session nếu session driver là file.cookie
– cookie key name để lưu trữ indentify session.
2. Session driver
# Database
Khi bạn sử dụng driver là database thì bạn cần phải tạo ra một table
để lưu trữ thông tin session. Để tạo table
các bạn chạy lệnh artisan sau:
php artisan session:table
Laravel sẽ sinh ra cho các bạn một file migrate có dạng như sau database/migrations/XXXX_XX_XX_XXXXXX_create_sessions_table.php
.
Tiếp theo các bạn cần migrate nó vào database
php artisan migrate
# Redis
Trước khi sử dụng Redis làm driver trong Laravel, bạn cần phải cài đặt redis
extension trong PHP (sử dụng PECL), hoặc sử dụng predis/predis
package qua composer. Chúng ta nên sử dụng redis extension
của PHP để cho performance tốt nhất
3. Tương tác với session
# Lấy dữ liệu
Có hai cách chính để các bạn có thể lấy được session. Đó là lấy thông qua session
helper hoặc sử dụng qua Request
instance.
Để lấy dữ liệu trong session các bạn sử dụng phương thức get
<?php
namespace App\Http\Controllers; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
class UserController extends Controller {
/**
* Show the profile for the given user.
*
* @param Request $request
* @param int $id
*/
public function show(Request $request, $id) {
$value = $request->session()->get('key');
// hoặc
$value = session('key');
// hoặc
$value = session()->get('key');
// hoặc
$value = Session::get('key');
}
}
Trong đó, nếu session key không tồn tại thì hàm get sẽ trả về null
. Nếu bạn muốn thay giá trị mặc định khi key không tồn tại thì có thể truyền vào tham số thứ 2 sẽ là giá trị mặc định khi key không tồn tại
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function () {
return 'default';
});
Để lấy tất cả session data, các bạn sử dụng phương thức all
$value = Session::all();
# Kiểm tra session
Để kiểm tra xem một sesion nào đó có tồn tại hay không các bạn sử dụng phương thức has
. Phương thức này sẽ trả về true
nếu session có tồn tại và khác null
Ví dụ: kiểm tra session users
có tồn tại và khác null
không?
if ($request->session()->has('users')) {
//
}
Nếu bạn chỉ cần kiểm tra xem session có tồn tại hay không, còn giá trị của nó là gì không quan tâm thì có thể sử dụng phương thức exists
. Phương thức này sẽ trả về true nếu trong session tồn tại key đó
if ($request->session()->exists('users')) {
//
}
# Lưu trữ session
Để lưu trữ sesion các bạn sử dụng phương thức put
với cú pháp:
session()->put($key, $value);
Trong đó:
$key
là key của session các bạn muốn lưu trữ.$value
là giá trị của session các bạn muốn lưu trữ.
Ví dụ:
$sessions = Session::put("cart.products", [['id' => 1, 'item' => 1]]);
Nếu session key của bạn có giá trị là array và bạn muốn push thêm data vào session key đó, bạn có thể sử dụng phương thức push
$sessions = Session::push("cart.products", ['id' => 2, 'item' => 1]);
Nếu muốn lấy ra session data xong xóa luôn key đó khỏi session. Bạn có thể sử dụng phương thức pull
Ví dụ: Lấy ra cart.products
và xóa luôn data khỏi session
sessions = Session::pull("cart.products");
Đối với phương thức này bạn cũng có thể set thêm giá trị default nếu như session key không tồn tại, bằng cách sử dụng tham số thứ 2.
Bạn cũng có thể tăng giảm giá trị của session bằng cách sử dụng phương thức increment
và decrement
$request->session()->increment('count');
$request->session()->increment('count', $incrementBy = 2);
$request->session()->decrement('count');
$request->session()->decrement('count', $decrementBy = 2);
# Flash session
Flash session là một dạng session chỉ tồn tại được trong một request, rồi sẽ bị xóa. Loại session này thường được sử dụng để làm các chức năng như validate, flash notify.
Để sử dụng flash session, các bạn sử dụng phương thức flash
với cú pháp:
$sessions = Session::flash($key, $value);
Trong đó:
$key
là key của session các bạn muốn lưu trữ.$value
là giá trị của session các bạn muốn lưu trữ.
Trong trường hợp bạn muốn giữ flash session tồn tại thêm một request nữa, bạn có thể sử dụng phương thức reflash
.
$request->session()->reflash();
# Xóa dữ liệu
Bạn có thể sử dụng phương thức forget
để xóa session trong Laravel.
// Xóa 1 sesion
$request->session()->forget('name');
// Xóa nhiều session
$request->session()->forget(['name', 'status']);
Nếu bạn muốn xóa hết session data, bạn có thể sử dụng phương thức flush
$request->session()->flush();
4. Khởi tạo lại Session ID
Muốn thay đổi lại session ID, bạn có thể sử dụng phương thức regenerate
$request->session()->regenerate();
Nếu như bạn muốn thay đổi session ID và xóa hết session data, bạn có thể sử dụng phương thức invalidate
$request->session()->invalidate();
Leave a Comment