Laravel Tutorial

Bài 17: Session trong Laravel

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ại storage/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  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