Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 19: Session trong Laravel 8

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ạ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. 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 incrementdecrement.

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!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha