Hướng dẫn Laravel Middleware
Middleware trong Laravel cung cấp một cơ chế thuận tiện để lọc các HTTP requests đi vào ứng dụng của bạn.
Giới thiệu về Middleware
Middleware hoạt động như một cầu nối giữa request và response. Nó cung cấp cơ chế thuận tiện để lọc và sửa đổi các HTTP requests đi vào ứng dụng của bạn.
Tại sao Middleware quan trọng
Middleware cho phép bạn:
- Xác thực người dùng.
- Ghi log requests.
- Sửa đổi dữ liệu request.
- Hạn chế truy cập dựa trên điều kiện.
Tạo Middleware
Tạo một middleware class sử dụng Artisan:
php artisan make:middleware EnsureTokenIsValid
Định nghĩa logic trong method handle:
public function handle($request, Closure $next) {
if ($request->input('token') !== 'valid-token') {
return response('Unauthorized', 401);
}
return $next($request);
}
Đăng ký Middleware
Thêm vào mảng $routeMiddleware trong app/Http/Kernel.php:
protected $routeMiddleware = [
'token.valid' => \App\Http\Middleware\EnsureTokenIsValid::class,
];
Sử dụng Middleware
Áp dụng middleware cho routes:
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('token.valid');
Sử dụng Middleware nâng cao
Global Middleware
Global middleware được áp dụng cho mọi HTTP request. Đăng ký trong mảng $middleware trong Kernel.php:
protected $middleware = [
\App\Http\Middleware\LogRequests::class,
];
Middleware Groups
Kết hợp nhiều middleware thành groups cho các tác vụ phổ biến:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
Áp dụng group cho routes:
Route::middleware(['web'])->group(function () {
Route::get('/home', [HomeController::class, 'index']);
});
Middleware Parameters
Truyền parameters cho middleware để có behavior động:
public function handle($request, Closure $next, $role) {
if (!$request->user() || $request->user()->role !== $role) {
return response('Forbidden', 403);
}
return $next($request);
}
Gán middleware với parameters:
Route::get('/admin', function () {
// ...
})->middleware('role:admin');
Các ví dụ Middleware phổ biến
- Authentication:
public function handle($request, Closure $next) {
if (auth()->guest()) {
return redirect('login');
}
return $next($request);
}
- Ghi log Requests:
public function handle($request, Closure $next) {
logger()->info('Request Logged:', ['url' => $request->url()]);
return $next($request);
}
- Xử lý CORS:
public function handle($request, Closure $next) {
$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
Test Middleware
Viết tests để đảm bảo middleware hoạt động như mong đợi:
public function test_middleware_blocks_unauthorized_requests() {
$response = $this->get('/protected-route');
$response->assertStatus(401);
}
Các phương pháp tốt nhất
- Giữ Middleware tập trung: Mỗi middleware nên xử lý một trách nhiệm duy nhất.
- Sử dụng Middleware Groups: Kết hợp middleware thành groups cho các tác vụ phổ biến (ví dụ:
web,api). - Tránh Business Logic: Middleware nên tập trung vào xử lý request/response, không phải application logic.
- Test Middleware: Viết tests để đảm bảo middleware hoạt động như mong đợi.
Middleware là công cụ mạnh mẽ để quản lý HTTP requests trong Laravel. Bằng cách làm chủ middleware, bạn có thể xây dựng các ứng dụng an toàn, hiệu quả và dễ bảo trì.