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 จะตรวจสอบว่า:
- ผู้ใช้ล็อกอินหรือยัง (
Auth::check()
) - สถานะของผู้ใช้เป็นผู้ดูแลระบบ (
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 เพื่อควบคุมสิทธิ์และประมวลผลก่อนการเข้าถึงข้อมูลสำคัญ