Ở bài route trong Laravel mình cũng có nhắc đến middleware trong Laravel rồi, nhưng chưa nói chi tiết về nó, bài này mình sẽ giới thiệu với mọi người về Middleware trong Laravel 8.
1. Middleware là gì?
Middleware theo wikipedia:
Middleware là phần mềm máy tính với nhiệm vụ kết nối các thành phần phần mềm hoặc các ứng dụng với nhau. Phần mềm loại này bao gồm một tập các dịch vụ cho phép sự tương tác giữa các tiến trình chạy trên một hoặc nhiều máy khác nhau. Công nghệ middleware đã được phát triển để cung cấp khả năng hoạt động tương hỗ, phục vụ cho các kiến trúc phân tán thường được để hỗ trợ và đơn giản hóa các ứng dụng phân tán phức tạp.
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.
VD: 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
.
2. Khai báo middleware.
Để tạo middleware trong Laravel các bạn sử dụng command:
php artisan make:middleware MiddlewareName
Trong đó: MiddlewareName
là tên của middleware các bạn muốn tạo.
VD: Mình sẽ tạo một middleware có name là EnsureTokenIsValid
.
php artisan make:middleware EnsureTokenIsValid
Lúc này Laravel sẽ sinh ra cho bạn một file middleware nằm trong thư mục app/Http/Middleware
với tên file là tên middleware các bạn vừa nhập. Ví dụ đối với VD trên thì file sẽ là app/Http/Middleware/EnsureTokenIsValid.php
File sẽ có nội dung như sau:
<?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)
{
return $next($request);
}
}
Trong đó: return $next($request)
chính là đoạn code cho phép request tiếp tục được thực thi.
VD: Mình sẽ redirect về URL /home
khi request không có token, hoặc token không phải bằng 'toidicode.com
'.
<?php
namespace App\Http\Middleware;
use Closure;
class EnsureTokenIsValid
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('token') !== 'toidicode.com') {
return redirect('home');
}
return $next($request);
}
}
Lúc này request các bạn gửi nê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
.
3. Đă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.
VD: Mình sẽ khai báo middleware EnsureTokenIsValid
vào trong $routeMiddleware
với name là 'validate_token
'.
/**
* 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.
VD:
Route::get('/user', function () {
//
})->middleware('validate_token');
4. 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
.
VD:
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ỉ work đối với middleware không phải global.
5. Middleware Parameter.
Trong một số trường hợp bạn muốn truyền thêm tham số vào middleware để thực thi các logic cho từng tham số đó. Bạn có thể tham khảo ví dụ sau.
VD: thêm tham số $redirectTo
vào middleware EnsureTokenIsValid
ở trên.
<?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
* @param string $redirectTo
* @return mixed
*/
public function handle(Request $request, Closure $next, $redirectTo = 'home')
{
if ($request->input('token') !== 'toidicode.com') {
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 các bạn sử dụng như sau:
Route::get('/', function () {
return redirect()->back();
})->middleware('validate_token:/login');
Trong đó: đằ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.
6. Lời kết.
Trong Laravel còn một loại middleware nữa, nhưng hiếm khi cần dùng nên mình không nói trong bài viết này. Ai cần có thể xem tại đây.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
0 Comments