Trong Laravel, middleware cung cấp một cơ chế thuận tiện để kiểm tra và lọc các HTTP request đến ứng dụng của bạn.
Ví dụ: middleware Authenticate
có tác dụng kiểm tra xem người dùng đang thực thi request đã đăng nhập hay chưa? Nếu chưa đăng nhập thì sẽ redirect về trang login và ngược lại đăng nhập rồi thì sẽ cho phép thực hiện request.
Trong Laravel, tất cả các middleware sẽ được đặt trong thư mục app/Http/Middleware
.
1. Khai báo middleware
Để tạo middleware trong Laravel các bạn sử dụng command:
php artisan make:middleware MiddlewareName
Ví dụ: Tạo một middleware có name là EnsureTokenIsValid
Ví dụ: Mình sẽ redirect về URL /home
khi request không có token, hoặc token không phải bằng ‘itcom
‘
app/Http/Middleware/EnsureTokenIsValid.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class EnsureTokenIsValid
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if ($request->input('token') !== 'itcom') {
return redirect('home');
}
return $next($request);
}
}
return $next($request)
chính là đoạn code cho phép request tiếp tục được thực thi
Closure
là một hàm ẩn danh (anonymous function). Closure
thường được sử dụng làm callback methods và có thể được sử dụng như một parameter trong một function. Closure
có thể sử dụng các biến bên ngoài phạm vi mà nó được tạo ra
Trong ví dụ trên thì request gửi lên nếu không có input token hoặc input token không phải là toidicode.com thì request sẽ được redirect về URL có path /home
2. Đăng ký middlware
Để đăng ký middlware vào trong app các bạn khai báo chúng ở trong file app/Http/Kernel.php
. Mặc định, Laravel có 3 loại middleware chính là:
- Global middleware: Các middlware được khai báo trong thuộc tính
$middleware
là global middleware, các middleware này sẽ được thực thi cho tất cả request. - Group middleware: Các middlware được khai báo trong thuộc tính
$middlewareGroups
sẽ được thực thi khi chúng ta gọi chúng. Mặc định thì Laravel định nghĩa ra 2 group là web và api tương ứng với các route trong web.php và api.php. - Route middleware: Các middlware được khai báo trong thuộc tính
$routeMiddleware
sẽ được thực thi khi chúng ta gọi tên chúng.
Ví dụ: Khai báo middleware EnsureTokenIsValid
vào trong $routeMiddleware
với name là ‘validate_token
‘
app/Http/Kernel.php
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
//...
'validate_token' => \App\Http\Middleware\EnsureTokenIsValid::class
];
Lúc này nếu route nào cần dùng chỉ cần khai báo middleware là ‘validate_token
‘ là được
Ví dụ: routes/web.php
Route::get('/user', function () {
//
})->middleware('validate_token');
3. Mức độ ưu tiên middleware
Thông thường middleware sẽ được thực thi theo thứ tự từ trên xuống. Nhưng nếu bạn muốn thay đổi thứ tự ưu tiên của một middleware nào đó. Bạn có thể thêm vào trong thuộc tính $middlewarePriority
trong file app/Http/Kernel.php
protected $middlewarePriority = [
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
Chú ý: $middlewarePriority
chỉ làm việc đối với middleware không phải global
4. Middleware Parameter
Ví dụ: Thêm tham số $redirectTo
vào middleware EnsureTokenIsValid
ở trên
app/Http/Middleware/EnsureTokenIsValid.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class EnsureTokenIsValid
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next, $redirectTo = 'home')
{
if ($request->input('token') !== 'itcom') {
return redirect($redirectTo);
}
return $next($request);
}
}
Lúc này khi gọi middleware
các bạn có thể truyền thêm tham số vào middleware
như sau:
routes/web.php
Route::get('/', function () {
return redirect()->back();
})->middleware('validate_token:/login');
Đằng sau dấu :
sẽ là tham số truyền vào middleware, nếu middleware có nhiều tham số truyền vào bạn có thể sử dụng dấu ,
để ngăn cách các biến.
Leave a Comment