Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 12: Middleware คืออะไรและการนำไปใช้

Middleware คืออะไร?

Middleware ใน Laravel เป็นส่วนที่ทำหน้าที่เป็นตัวกลางระหว่างคำขอ (Request) และการตอบสนอง (Response) โดยสามารถตรวจสอบ แก้ไข หรือกรองคำขอก่อนที่จะถึง Controller หรือส่งกลับไปยังผู้ใช้ ตัวอย่างการใช้งาน Middleware เช่น การตรวจสอบว่าผู้ใช้ล็อกอินแล้วหรือยัง, การตรวจสอบสิทธิ์การเข้าถึง, การป้องกันคำขอจากแหล่งที่ไม่น่าเชื่อถือ เป็นต้น

Laravel มี Middleware พื้นฐานที่ติดตั้งมาให้ เช่น:

  • auth – ตรวจสอบว่าผู้ใช้ล็อกอินหรือยัง
  • guest – ตรวจสอบว่าผู้ใช้ยังไม่ได้ล็อกอิน
  • verified – ตรวจสอบว่าผู้ใช้ยืนยันอีเมลแล้วหรือยัง

การสร้าง Middleware ใน Laravel

เราสามารถสร้าง Middleware ใหม่ได้โดยใช้คำสั่ง Artisan make:middleware ตามด้วยชื่อ Middleware ที่ต้องการ เช่น:

php artisan make:middleware CheckAdmin

คำสั่งนี้จะสร้างไฟล์ CheckAdmin.php ในโฟลเดอร์ app/Http/Middleware/ ซึ่งเป็นตำแหน่งที่เก็บ Middleware ทั้งหมดใน Laravel

ตัวอย่างการเขียน Middleware

ตัวอย่างการสร้าง Middleware เพื่อเช็คสิทธิ์ของผู้ใช้ว่าเป็นผู้ดูแลระบบหรือไม่ (เช่น มีสถานะ is_admin เป็น true)

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CheckAdmin
{
    public function handle(Request $request, Closure $next)
    {
        if (Auth::check() && Auth::user()->is_admin) {
            return $next($request); // ส่งคำขอไปยัง Controller ต่อไป
        }
        return redirect('/'); // ถ้าไม่ใช่ admin ให้กลับไปหน้าแรก
    }
}

ในตัวอย่างนี้ Middleware จะตรวจสอบว่า:

  1. ผู้ใช้ล็อกอินหรือยัง (Auth::check())
  2. สถานะของผู้ใช้เป็นผู้ดูแลระบบ (Auth::user()->is_admin)

หากผู้ใช้ผ่านเงื่อนไขทั้งสองอย่าง คำขอจะถูกส่งไปยัง Controller ต่อไป แต่ถ้าไม่ผ่าน Middleware จะส่งผู้ใช้กลับไปยังหน้าแรก (/)

การลงทะเบียน Middleware

หลังจากสร้าง Middleware แล้ว เราจำเป็นต้องลงทะเบียน Middleware นี้ในไฟล์ app/Http/Kernel.php โดยสามารถเพิ่ม Middleware ในส่วนของ $routeMiddleware ได้ ดังนี้:

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'checkAdmin' => \App\Http\Middleware\CheckAdmin::class,
];

การเพิ่มใน $routeMiddleware ทำให้สามารถเรียกใช้ Middleware นี้ใน Route ได้โดยการใช้ชื่อ checkAdmin

การนำ Middleware ไปใช้งานใน Route

เมื่อเราลงทะเบียน Middleware แล้ว สามารถนำไปใช้งานใน Route โดยการระบุชื่อ Middleware ในการกำหนดเส้นทาง เช่น:

use App\Http\Controllers\AdminController;

Route::get('/admin', [AdminController::class, 'index'])->middleware('checkAdmin');

ในตัวอย่างนี้ เมื่อมีผู้ใช้เข้าถึง URL /admin ระบบจะตรวจสอบว่าเป็นผู้ดูแลระบบหรือไม่ ถ้าไม่ใช่จะถูกส่งกลับไปยังหน้าแรก

นอกจากนี้ สามารถนำไปใช้กับ Route Group ได้ เช่น:

Route::middleware(['checkAdmin'])->group(function () {
    Route::get('/admin', [AdminController::class, 'index']);
    Route::get('/admin/settings', [AdminController::class, 'settings']);
});

ในตัวอย่างนี้ Route ภายใน Group จะถูกตรวจสอบว่าเป็นผู้ดูแลระบบหรือไม่ก่อนที่จะอนุญาตให้เข้าถึง

การนำไปใช้งาน

Middleware ช่วยให้การจัดการการเข้าถึงของผู้ใช้งานเป็นไปอย่างมีระบบ และยังช่วยกรองคำขอจากผู้ใช้ ทำให้แอปพลิเคชันปลอดภัยมากขึ้น โดยสามารถใช้งานร่วมกับ Route หรือ Controller เพื่อควบคุมสิทธิ์และประมวลผลก่อนการเข้าถึงข้อมูลสำคัญ