Trong một ứng dụng Laravel cơ bản, không phải mọi HTTP Request đều nên được xử lý trực tiếp bởi Controller. Trước khi request đi đến phần nghiệp vụ chính, hệ thống có thể cần kiểm tra người dùng đã đăng nhập hay chưa, xác thực quyền truy cập, kiểm tra dữ liệu hoặc thực hiện một số điều kiện khác. Laravel Middleware được thiết kế để xử lý chính lớp logic trung gian này. Middleware có thể kiểm tra request trước khi cho phép tiếp tục hoặc chặn request ngay từ đầu. Nhờ đó, những quy tắc dùng chung như bảo vệ route, xác thực người dùng hay lọc request có thể được tách khỏi Controller.
Laravel Middleware là gì?
Laravel Middleware là một lớp nằm giữa HTTP Request và ứng dụng, có nhiệm vụ kiểm tra hoặc xử lý request trước khi request được chuyển đến logic tiếp theo.
Có thể hình dung:
HTTP Request
↓
Middleware
↓
Controller
↓
Response
Middleware có thể:
- Cho request tiếp tục.
- Chặn request.
- Chuyển hướng người dùng.
- Kiểm tra trạng thái đăng nhập.
- Kiểm tra quyền truy cập.
- Gắn thêm dữ liệu vào request.
- Xử lý logic trước hoặc sau Controller.
Ví dụ, một route quản trị có thể yêu cầu người dùng phải đăng nhập:
User Request
↓
auth Middleware
↓
Đã đăng nhập?
↙ ↘
Có Không
↓ ↓
Controller Redirect Login

Tạo Middleware bằng Artisan
Laravel cung cấp Artisan Command để tạo Middleware:
php artisan make:middleware CheckUserStatus
File Middleware thường nằm tại: app/Http/Middleware/
Ví dụ:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class CheckUserStatus
{
public function handle(
Request $request,
Closure $next
): Response {
return $next($request);
}
}
Sau đó, bạn có thể bổ sung điều kiện cần kiểm tra vào phương thức handle().
Middleware dùng để bảo vệ Route
Một trong những trường hợp sử dụng phổ biến nhất là bảo vệ route.
Ví dụ:
Route::get(‘/dashboard’, function () {
return view(‘dashboard’);
})->middleware(‘auth’);
Route /dashboard sẽ yêu cầu người dùng đáp ứng điều kiện của Middleware auth.
Có thể áp dụng Middleware cho nhiều route:
Route::middleware(‘auth’)->group(function () {
Route::get(‘/dashboard’, …);
Route::get(‘/profile’, …);
Route::get(‘/orders’, …);
});
Cách này tránh phải khai báo auth lặp lại trên từng route.
Middleware lọc request như thế nào?
Middleware có thể kiểm tra dữ liệu hoặc điều kiện của Request trước khi cho phép xử lý tiếp.
Ví dụ kiểm tra API key:
public function handle(Request $request, Closure $next): Response
{
if ($request->header(‘X-API-Key’) !== config(‘app.api_key’)) {
abort(403);
}
return $next($request);
}
Nếu request không đáp ứng điều kiện, Middleware trả về lỗi và Controller không được thực thi.
Có thể hình dung:
Request
↓
Kiểm tra điều kiện
↓
Hợp lệ?
↓ ↓
Có Không
↓ ↓
Controller Chặn
Đây chính là vai trò “lọc request” của Middleware.
Middleware nhận tham số
Middleware có thể nhận thêm tham số từ Route.
Ví dụ:
Route::get(‘/admin’, …)
->middleware(‘role:admin’);
Middleware:
public function handle(
Request $request,
Closure $next,
string $role
): Response {
if ($request->user()?->role !== $role) {
abort(403);
}
return $next($request);
}
Khi đó: role “admin” sẽ truyền giá trị admin vào tham số $role.
Có thể mở rộng cho nhiều giá trị tùy logic:
->middleware(‘role:admin,manager’);
Cách xử lý nhiều tham số cần được thiết kế phù hợp với chữ ký của Middleware và nghiệp vụ thực tế.
Middleware toàn cục và Middleware theo Route
Middleware có thể được áp dụng ở những phạm vi khác nhau.
Global Middleware
Global Middleware được áp dụng cho toàn bộ request đi qua ứng dụng. Loại Middleware này phù hợp với những logic thực sự cần áp dụng rộng rãi. Không nên đưa những kiểm tra chỉ dành cho một nhóm route vào Global Middleware vì sẽ khiến ứng dụng phải xử lý logic không cần thiết.
Route Middleware
Route Middleware chỉ được áp dụng cho route hoặc nhóm route cụ thể.
Ví dụ:
Route::get(‘/profile’, …)
->middleware(‘auth’);
Hoặc:
Route::middleware([‘auth’, ‘verified’])->group(function () {
// Các route cần xác thực
});
Trong thực tế, Route Middleware thường linh hoạt hơn khi chỉ một phần ứng dụng cần điều kiện bảo vệ.
Middleware xử lý trước và sau Controller
Middleware không chỉ xử lý request trước Controller. Nó còn có thể xử lý response sau khi logic phía sau hoàn thành.
Ví dụ:
public function handle(Request $request, Closure $next): Response
{
// Xử lý trước Controller
$response = $next($request);
// Xử lý sau Controller
return $response;
}
Luồng xử lý:
Request
↓
Middleware trước
↓
Controller
↓
Middleware sau
↓
Response
Cấu trúc này hữu ích khi cần thực hiện một hành động trước và sau quá trình xử lý request.
Middleware và Authentication
Authentication là một trong những ứng dụng tiêu biểu của Middleware.
Ví dụ:
Route::middleware(‘auth’)->group(function () {
Route::get(‘/dashboard’, …);
});
Middleware auth kiểm tra trạng thái xác thực trước khi cho phép người dùng truy cập. Nếu chưa đăng nhập, ứng dụng có thể chuyển người dùng đến trang login tùy cấu hình. Điểm quan trọng là Middleware kiểm tra điều kiện truy cập, còn cơ chế Authentication chịu trách nhiệm xác định người dùng là ai.
Middleware và Authorization
Middleware cũng có thể tham gia kiểm soát quyền truy cập.
Ví dụ một khu vực chỉ dành cho quản trị viên:
Route::middleware([‘auth’, ‘admin’])->group(function () {
Route::get(‘/admin/dashboard’, …);
});
Trong đó:
- auth kiểm tra người dùng đã đăng nhập.
- admin kiểm tra điều kiện quyền quản trị.
Với hệ thống phân quyền phức tạp, Laravel còn cung cấp Gate và Policy. Middleware không nhất thiết phải chứa toàn bộ logic Authorization của ứng dụng.
Middleware khác Validation như thế nào?
Hai cơ chế này đều có thể kiểm tra Request nhưng mục đích khác nhau.
Middleware thường kiểm tra điều kiện để request được phép đi tiếp:
Đã đăng nhập?
Có quyền?
Có API key?
Đúng môi trường?
Validation tập trung kiểm tra dữ liệu đầu vào:
Email có hợp lệ?
Tên có bắt buộc?
Giá trị có đúng định dạng?
Ví dụ:
$request->validate([
’email’ => [‘required’, ’email’],
]);
Vì vậy, không nên đưa toàn bộ logic Validation vào Middleware chỉ vì Middleware có khả năng đọc Request.

Middleware và Controller nên phân chia trách nhiệm thế nào?
Một lỗi thường gặp là đưa quá nhiều nghiệp vụ vào Middleware.
Ví dụ không nên biến Middleware thành nơi xử lý:
Tính giá đơn hàng
Tạo đơn hàng
Thanh toán
Cập nhật kho
Gửi email
Middleware nên tập trung vào những điều kiện hoặc xử lý mang tính trung gian.
Có thể phân chia đơn giản:
| Thành phần | Trách nhiệm |
| Middleware | Kiểm tra/lọc Request |
| Controller | Điều phối Request |
| Service | Xử lý nghiệp vụ phức tạp |
| Model | Làm việc với dữ liệu |
| Validation | Kiểm tra dữ liệu đầu vào |
Cách phân chia này giúp mã nguồn dễ đọc và bảo trì hơn.
Một số Middleware thường gặp
Laravel có nhiều Middleware phục vụ những nhu cầu khác nhau, chẳng hạn:
- auth – yêu cầu xác thực.
- guest – dành cho người chưa đăng nhập.
- verified – yêu cầu email đã được xác minh.
- throttle – giới hạn tần suất request trong những trường hợp phù hợp.
Tên và cấu hình Middleware có thể thay đổi tùy phiên bản Laravel và cách ứng dụng được xây dựng, vì vậy nên kiểm tra cấu hình thực tế của dự án khi triển khai.
Kết luận
Laravel Middleware là lớp trung gian giúp kiểm tra và lọc HTTP Request trước khi request đi vào phần xử lý chính của ứng dụng. Đây là thành phần quan trọng để bảo vệ Route, kiểm tra Authentication, Authorization và thực hiện những logic dùng chung. Khi thiết kế Middleware, nguyên tắc quan trọng là chỉ đặt những logic thực sự thuộc lớp trung gian. Điều này giúp Controller và các lớp nghiệp vụ không bị phình to, đồng thời khiến việc bảo vệ và kiểm soát request trong toàn bộ ứng dụng Laravel trở nên rõ ràng hơn. Để tiếp tục hệ thống hóa các thành phần cốt lõi của Framework, bạn có thể tham khảo Học Laravel và kết nối kiến thức Middleware với Routing, Authentication, Authorization và Request.

