Bài 13: Session trong Laravel

I. Session là gì

 Session trong PHP được dùng để lưu trữ thông tin của người dùng hoặc là lưu trữ tùy chọn cấu hình hệ thống cho người dùng. Session sẽ được lưu trên server. Mỗi client sẽ có một ID session khác nhau nên sẽ tránh được sự ảnh hưởng thông tin Session giữa các client khác nhau.

II. Session trong laravel

Laravel cung cấp các trình điều khiển khác nhau để lưu dữ liệu session như FileCookie, Memcached/RedisDatabase. Theo mặc định, kiểu lưu trữ File được sử dụng vì nó nhẹ. Bạn có thể cấu hình Session trong file config/session.php.

* Đối với kiểu lưu trữ Session trong database các bạn sẽ cần tạo thêm table session. Để tạo table trước hết các bạn cần tạo Migration:

php artisan make:migration creat_sessions_table

Lệnh này sẽ tạo file xxxx_creat_sessions_table.php (xxxx là ngày tháng tạo) trong thư mục database/migrations. Các bạn sửa lại function up() thành như sau:

Schema::create('sessions', function ($table) {
    $table->string('id')->unique();
    $table->unsignedInteger('user_id')->nullable();
    $table->string('ip_address', 45)->nullable();
    $table->text('user_agent')->nullable();
    $table->text('payload');
    $table->integer('last_activity');
});

Sau đó chạy lệnh:

php artisan migrate

III. Sử dụng session trong Laravel

1. Tạo Session

Để tạo Session các bạn dùng phương thức put():

$request->session()->put('key', 'value');

Trong đó:

  • key: Khóa chính dùng để get Session hoặc xóa Session sau này

  • value: Giá trị của Session

Có một lưu ý nhỏ ở đây. Với cách viết này các bạn sẽ cần thêm Request vào function. Ví dụ:

public function show(Request $request, $id)
{
   $value = $request->session()->put('key', 'value');
}

Trong trường hợp bạn không muốn thêm Request bạn có thể dùng Session Facade:

public function show($id)
{
   $value = \Session::put('key', 'value');
}

* Chú ý: Ở đây mình viết \Session chứ không phải là Session. Lý do là mình không sử dụng use. Có nghĩa nếu các bạn muốn viết Session chứ không phải là \Session thì các bạn sẽ phải sử dụng use Session trong file. Ví dụ:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Session;

class UserController extends Controller
{
    public function show($id)
    {
        $value = Session::put('key', 'value');
    }
}
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    public function show($id)
    {
        $value = \Session::put('key', 'value');
    }
}

Các bạn có thể dễ dàng nhìn thấy sự khác nhau qua 2 đoạn code ví dụ trên. 

* Ngoài 2 cách viết trên chúng ta có thể sử dụng session() helper với phương thức get()put() mà không cần $request

session()->put('key', $value);

2. Lấy giá trị Session

Để lấy giá trị của Session các bạn dùng get():

$value = $request->session()->get('key');

// Hoặc

$value = session()->get('key');

// Hoặc

$value = \Session::get('key);

3. Flash Session

Dữ liệu được lưu trữ trong Flash Session chỉ tồn tại  trong một truy cập duy nhất diễn ra ngay sau lượt truy cập mà việc gán dữ liệu được thực hiện. Nó sẽ bị xóa ngay sau khi bạn F5 trình duyệt. Dữ liệu flash chủ yếu hữu ích cho việc sử dụng tạo các câu thông báo.

Ví dụ: Khi bạn sửa bài viết. Sau khi bấm nút update bạn muốn in ra câu thông báo thành công hay thất bại thì bạn có thể dùng Flash Session.

$request->session()->flash('key', 'value');

// Hoặc

\Session::flash('key', 'value')

Để get giá trị Flash Session các bạn sử dụng phương thức get() như bình thường.

4. Xóa Session

Để xóa Session chúng ta có khá nhiều cách.

a. Sử dụng pull()

Phương thức pull() sẽ lấy về giá trị của Session sau đó mới tiến hành xóa Session:

$value = $request->session()->pull('key');

// Hoặc

\Session::pull('key');

b. Sử dụng forget();

Phương thức forget() sử dụng khi bạn chỉ muốn xóa  một hoặc nhiều Session thông qua key

// Forget a single key...
$request->session()->forget('key');

// Forget multiple keys...
$request->session()->forget(['key1', 'key2']);

// Hoặc

\Session::forget('key');

\Session::forget(['key1', 'key2']);

c. Sử dụng flush()

Phương thức flush() sẽ xóa toàn bộ Session đang có

$request->session()->flush();

// Hoặc

\Session:flush();

5. Session ID

Việc tạo lại Session ID thường được sử dụng để ngăn ngừa các cuộc tấn công thông qua Session ID.

Laravel sẽ tự động tạo lại Session ID trong khi xác thực nếu bạn đang sử dụng lớp Auth cho việc đăng nhập. Tuy nhiên, nếu bạn cần tự tạo lại Session ID, bạn có thể sử dụng phương thức sau:

$request->session()->regenerate();

// Hoặc

\Session::regenerate();

Để tìm hiểu thêm về Session trong Laravel các bạn có thể tham khảo thêm tại Laravel Document.