Như các bạn cũng đã 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ợ chúng ta rất mạnh về session và đương nhiên là 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. Các yêu cầu cho từng 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
.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSessionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
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();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('sessions');
}
}
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.
Trong đó thì mọi người 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
Trong Laravel, 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
.
VD: các cách lấy dữ liệu session.
<?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.
VD:
$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
.
VD:
use Illuminate\Support\Facades\Session;
$data = 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
.
VD: 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 đó.
VD: Kiểm tra trong session có tồn tại key users
.
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ữ.
VD:
use Illuminate\Support\Facades\Session;
$sessions = Session::put("cart.products", [['id' => 1, 'item' => 1]]);
Trong trường hợp 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
.
VD: Push thêm product vào session key cart.products
ở ví dụ trên.
use Illuminate\Support\Facades\Session;
$sessions = Session::push("cart.products", ['id' => 2, 'item' => 1]);
Trong trường hợp, bạn 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
.
VD: Lấy ra cart.products
và xóa luôn data khỏi session.
use Illuminate\Support\Facades\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
.
VD:
$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:
use Illuminate\Support\Facades\Session;
$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
.
VD:
$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.
VD:
// Forget a single key...
$request->session()->forget('name');
// Forget multiple keys...
$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
.
VD:
$request->session()->flush();
4. Khởi tạo lại session ID.
Trong một vài trường hợp nếu như bạn muốn thay đổi lại session ID, bạn có thể sử dụng phương thức regenerate
.
VD:
$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
.
VD:
$request->session()->invalidate();
5. Lời kết.
Phần này mình mới chỉ nêu ra các khái niệm cơ bản liên quan đến session trong Laravel. Ngoài ra các khái niệm như block session hay tạo mới một session driver trong Laravel mình sẽ trình bài ở một series khác.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
dsa
3 năm trước