Middleware Laravel bạn thực sự đã hiểu nó?

Middleware là gì? middleware là phần nằm giữa các resquest từ người dùng đến hệ thống nó sẽ kiểm xem các request có thoả mãn các điều kiện do mình cung cấp hay không. Giả sử chúng ta có 1 điều kiện để áp dụng cho nhiều function thì tránh việc phải thêm điều kiện

Middleware là gì?

middleware là phần nằm giữa các resquest từ người dùng đến hệ thống nó
sẽ kiểm xem các request có thoả mãn các điều kiện do mình cung cấp hay không.
Giả sử chúng ta có 1 điều kiện để áp dụng cho nhiều function thì tránh việc phải thêm điều kiện vào từng function thì laravel đã cung cấp 1 cách dễ dàng hơn đó là sử dụng middleware để gom những router cần phải kiểm tra điều kiện lại để code ngắn gọn hơn.

Tạo middleware

Để tạo một middleware mới, sử dụng câu lệnh Artisan make:middleware:

php artisan make:middleware AgeMiddleware

Câu lệnh này sẽ tạo class AgeMiddleware bên trong thư mục app/Http/Middleware. Trong middleware này, chúng ta sẽ chỉ cho phép truy cập vào route nếu như giá trị age < 18. Nếu không, thì sẽ chuyển hướng users trở lại “home” URI.

<?phpnamespaceAppHttpMiddleware;useClosure;classAgeMiddleware{/**
     * Run the request filter.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */publicfunctionhandle($request,Closure$next){if($request->age<18){returnredirect('home');}return$next($request);}}

Before / After Middleware

Việc một middleware chạy trước hay sau một request phụ thuộc vào chính nó. Ví dụ, middleware dưới đây sẽ thực hiện vài tác vụ trước khi request được chương trình xử lý:

<?phpnamespaceAppHttpMiddleware;useClosure;classBeforeMiddleware{publicfunctionhandle($request,Closure$next){// Perform actionreturn$next($request);}}

Tuy nhiên, middleware này sẽ thực hiện việc của nó sau khi request được xử lý bởi chương trình:

<?phpnamespaceAppHttpMiddleware;useClosure;classAfterMiddleware{publicfunctionhandle($request,Closure$next){$response=$next($request);// Perform actionreturn$response;}}

Đăng kí middleware

Global Middleware

Nếu bạn muốn một middleware có thể được thực thi trong mỗi HTTP request tới chương trình, đơn giản chỉ cần thêm tên class của middleware đó vào trong thuộc tính $middleware của class app/Http/Kernel.php.

Thiết lập middleware cho route

Nếu bạn muốn thiết lập middleware cho một số route cụ thể, bạn đầu tiên cần phải thêm middleware vào trong biến $routeMiddleware trong file app/Http/Kernel.php và đặt cho nó một key:

protected$routeMiddleware=['auth'=>AppHttpMiddlewareAuthenticate::class,'auth.basic'=>IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,'guest'=>AppHttpMiddlewareRedirectIfAuthenticated::class,'throttle'=>IlluminateRoutingMiddlewareThrottleRequests::class,];

Sau khi đã được khai báo trong HTTP Kernel, bạn có thể sử dụng khoá middleware để thiết lập thông số cài vào trong route:

Route::get('admin/profile',['middleware'=>'auth',function(){//}]);

Sử dụng một array để thực hiện gán nhiều middleware vào trong route:

Route::get('/',['middleware'=>['first','second'],function(){//}]);

Tạo nhóm middleware

Sẽ có lúc bạn muốn thực hiện nhóm một vài middleware lại vào trong một khoá để có thể thực hiện gán vào route dễ dàng hơn. Bạn có thể làm như vậy bằng cách sử dụng thuộc tính $middlewareGroups của HTTP kernel.

Về cơ bản, Laravel cung cấp sẵn hai nhóm middleware thường sử dụng mà bạn có thể muốn áp dụng cho web UI hay API:

/**
 * The application's route middleware groups.
 *
 * @var array
 */protected$middlewareGroups=['web'=>[AppHttpMiddlewareEncryptCookies::class,IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,IlluminateSessionMiddlewareStartSession::class,IlluminateViewMiddlewareShareErrorsFromSession::class,AppHttpMiddlewareVerifyCsrfToken::class,],'api'=>['throttle:60,1','auth:api',],];

Các nhóm middleware được gán vào route và controller action sử dụng cú pháp tương tự như với từng middleware riêng. Việc sử dụng nhóm middleware sẽ làm cho việc gán các middleware vào trong một route trở nên tiện hơn:

Route::group(['middleware'=>['web']],function(){//});

Middleware Parameters

Middleware cũng có thể nhận các tham số truyền vào. Ví dụ, nếu chương trình cần xác nhận user đã được xác thực có “role” cụ thể trước khi thực hiện một thao tác nào đó, bạn có thể tạo ra RoleMiddleware để nhận tên của role như một tham số.

Các tham số của middleware sẽ được truyền vào thành tham số của hàm handle ngay sau tham số $next:

<?phpnamespaceAppHttpMiddleware;useClosure;classRoleMiddleware{/**
     * Run the request filter.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @param  string  $role
     * @return mixed
     */publicfunctionhandle($request,Closure$next,$role){if(!$request->user()->hasRole($role)){// Redirect...}return$next($request);}}

Tham số cho middleware cũng có thể được khai báo trên route bằng cách phân cách tên middleware và tham số bởi dấu :. Nhiều tham số phân cách nhau bởi dấu phẩy ,:

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ