1.Mở đầu

Xin chào toàn bộ các bạn, đã rất lâu rồi kể từ lần cuối mình viết bài viết chia sẻ những kiến thức cơ phiên bản về Laravel tương tự như viết tiếp series Laravel up & running. Thì từ bây giờ mình đã trở về với một nội dung bài viết mới cùng sẽ thay gắng cập nhật series chia sẻ kiến thức cơ phiên bản cho chúng ta mới tiếp cận với Laravel này phần đa hơn. Trong nội dung bài viết hôm này, chúng ta sẽ cùng tìm hiểu về có mang Middleware tronng web, nào bọn họ cùng bắt đầu.

Bạn đang xem: Middleware

2. Middleware dùng để triển khai gì ?

Trước khi bước vào việc sản xuất và áp dụng Middleware vào Laravel thì bọn họ sẽ cùng tò mò về chức năng của nó qua. Giả sử bọn họ có một website xem phim trả mức giá với một vài nhân kiệt như:

Xem danh sách các tập phim mà hệ thống của người sử dụng cóXem một cỗ phimDownload phim về máy

Và tương ứng họ sẽ bao gồm vài chức năng như sau:

class MovieController extends Controller public function getList(Request $request) // Lấy list các bộ phim truyện public function watchMovie(Request $request) // coi một tập phim public function downloadMovie(Request $request) // Download tập phim bạn chọn Vì trang web bọn họ là website phải trả mức giá nên đồng nghĩa với việc người dùng phải là tài khoản đã singin rồi để có thể thực hiện tính năng nói trên. Với phương pháp làm thường thì thì ta có thể thêm đoạn code kiểm trả xem người dùng đã đăng nhập không ở mỗi tác dụng như sau:

class MovieController extends Controller public function getList(Request $request) if (Auth::check()) // Lấy danh sách các bộ phim truyền hình public function watchMovie(Request $request) if (Auth::check()) // xem một bộ phim public function downloadMovie(Request $request) if (Auth::check()) // Download tập phim bạn lựa chọn Nếu trang web của doanh nghiệp chỉ gồm 3 tác dụng thì cũng ok không có vấn đề gì khổng lồ tát lắm. Nhưng mà thử tưởng tượng chúng ta có mang lại 50 tính năng đều bắt buộc kiểm tra đăng nhập thì sao ? bạn có thể vẫn try-hard bằng phương pháp copy lại phần code kia cho tất cả 50 tác dụng như bên trên và hồ hết thứ lại chạy đâu vào đó. Tuy nhiên một hôm đẹp trời, 50 kĩ năng này của bạn lại cần phải kiểm tra xem nếu người dùng đã đăng nhập với trong tài khoảng trong phim yêu cầu có lớn hơn 50k VND thì sao.

*

Để giải quyết bài toán như nói bên trên thì họ sẽ bao gồm khái niệm website Middleware . Đơn giản nhất bạn cũng có thể hiểu nó phần trong vận dụng của bạn cho phép bạn gom toàn thể 50 lần đoạn code nói trên về chung một nột tính năng duy duy nhất và hoàn toàn có thể tái thực hiện lại. Middleware sẽ sở hữu được vai trò đứng giữa những request từ người dùng đến hệ thống của doanh nghiệp và soát sổ xem nó có vừa lòng các điều kiện mà bạn muốn trước khi có thể truy cập vào tài năng mà bạn cung câp:

Người dùng đã đăng nhậpTài khoảng của người tiêu dùng có > 50k VND

*

Như bạn thấy toàn bộ những yêu cầu của người tiêu dùng đều phải trải qua đây trước khi rất có thể thực hiện các tính năng mà chúng ta cung cấp. Đồng nghĩa với việc ở đây, chúng ta có thể lầm bất kể thứ gì mà chúng ta muốn với request này trước khi bạn cho nó tiếp tục dịch rời đến tính năng của doanh nghiệp hoặc từ chối không đến nó đi tiếp.

Xem thêm: Phân Tích Kết Cấu Cầu Thang Dạng Dầm Limon Là Gì, Dầm Limon Là Gì

3. Middleware trong Laravel

Để tạo bắt đầu một middleware, ta áp dụng cú pháp:

php artisan make:middleware ở phía trên giả sử mình sẽ tạo một middleware để soát sổ trường hòa hợp mà họ nói trên như sau:

php artisan make:middleware VerifyAccountBalanceSau khi bạn chạy lệnh bên trên thì Laravel sẽ tạo ra cho chúng ta một file bắt đầu nằm trong đường dẫn app/Http/Middleware/VerifyAccountBalance.php và có nội dung như sau:

namespace AppHttpMiddleware;use Closure;class VerifyAccountBalance /** * Handle an incoming request. * *
return mixed */ public function handle($request, Closure $next) return $next($request); Middleware mà bọn họ tạo ra tại đây chỉ có duy độc nhất vô nhị một function là handle() và 2 tham số truyền vào theo thứ tự là $request - request từ bỏ phía người dùng và một closure tên là $next dùng khiến cho request của tín đồ dùng thường xuyên truy cập đến tính năng trong ứng dụng của chúng ta khi nó thỏa mãn nhu cầu hết những yêu cầu bạn đặt ra. Nếu khách hàng không biết closure là gì thì có thể đọc tại đây, còn không bạn có thể hiểu phần return $next($reuqest); sẽ có thể chấp nhận được request của người tiêu dùng được liên tiếp được thực hiện. Như ví dụ từ trước kia ta sẽ đề xuất kiểm tra 2 thiết bị đó là người dùng đã đăng nhập và thông tin tài khoản có to hơn 50K VND. Ta rất có thể viết lại ngôn từ hàm handle() như sau:

public function handle($request, Closure $next) if (Auth::check() && Auth()::user()->getAccountBalance() > 50000) return $next($request); return redirect("home")->with("message", __("Some error message"));Ở đoạn code bên trên thì ví như request trường đoản cú phía người dùng thỏa mãn 2 đk mà bọn họ đặt ra thì họ sẽ đến họ thường xuyên truy cập vào tác dụng còn trong trường hợp trái lại thì chúng ta sẽ redirect người dùng quay về trang home kèm theo một đoạn message nào này mà bạn muốn muốn. Đến phía trên là bọn họ đã tạo thành được một Middleware nhằm gom nhóm việc kiểm tra này lại vào trong một class rồi. Kế tiếp để dùng được nó thì ta sẽ phải khai báo nó trong file app/Http/Kernel.php. Các bạn mở tệp tin này lên sẽ thấy có nhiều nội dung trong các số đó rồi nhưng họ sẽ chưa bàn nó ở đây mà ta chỉ tập tầm thường vào phần này:

protected $routeMiddleware = < "auth" => AppHttpMiddlewareAuthenticate::class, "auth.basic" => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class, "bindings" => IlluminateRoutingMiddlewareSubstituteBindings::class, "cache.headers" => IlluminateHttpMiddlewareSetCacheHeaders::class, "can" => IlluminateAuthMiddlewareAuthorize::class, "guest" => AppHttpMiddlewareRedirectIfAuthenticated::class, "signed" => IlluminateRoutingMiddlewareValidateSignature::class, "throttle" => IlluminateRoutingMiddlewareThrottleRequests::class, "verified" => IlluminateAuthMiddlewareEnsureEmailIsVerified::class,>;Đây là nơi mà bọn họ sẽ khai báo các middleware để có thể dùng trong tệp tin routes/web.php của chúng ta, mang định nó đã có rất nhiều các middleware khác mà Laravel đã tạo ra sẵn cho bọn họ để sử dụng nhưng ta sẽ không bàn mang đến ở đây. Để thêm middleware mà chúng ta mới tạo, bạn chỉ việc thêm câu chữ sau vào sinh sống dưới mạng nói trên:

"verfiy-account-balance" => AppHttpMiddlewareVerifyAccountBalance::class,Giờ đây cố kỉnh vì chúng ta phải copy đi copy lại đoạn code kiểm soát 2 điều kiện mà bạn đề ra trong tất các các hàm ở các controller thì chúng ta có thể đơn giản hóa nó tức thì từ trong router như sau:

Route::group(<"middleware" => "verfiy-account-balance">, function() Route::get("get-list-movie", ""); Route::get("watch-movie", ""); Route::get("download-movie", ""); // 47 tính năng khác);ở đây các bạn nhớ đặt phần "middleware" => "verfiy-account-balance" trùng với thương hiệu mà bọn họ đã khai báo trong tệp tin Kernel.php. Giờ đây trước lúc request từ người dùng được sử lý vào controller của chúng ta thì nó sẽ tiến hành kiểm tra theo đk mà bọn họ đặt ra rồi mới có thể đi tiếp. Xung quanh cách viết như trên thì để sử dụng middleware cho 1 route độc nhất thì ta cũng có thể viết:

Route::get("get-list-movie", "")->middleware("verfiy-account-balance");

4. Sử dụng middleware đã gồm sẵn của Laravel

Ở trong file Kernel.php các bạn sẽ thấy có một số trong những phần như sau:

protected $middleware = < AppHttpMiddlewareTrustProxies::class, AppHttpMiddlewareCheckForMaintenanceMode::class, IlluminateFoundationHttpMiddlewareValidatePostSize::class, AppHttpMiddlewareTrimStrings::class, IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,>;Đây là những middleware dạng global nghĩa là tất cả các request từ phía người dùng sẽ được đi qua các class nói trên trước lúc đi sau đó với tác dụng của bạn

protected $middlewareGroups = < "web" => < AppHttpMiddlewareEncryptCookies::class, IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class, IlluminateSessionMiddlewareStartSession::class, // IlluminateSessionMiddlewareAuthenticateSession::class, IlluminateViewMiddlewareShareErrorsFromSession::class, AppHttpMiddlewareVerifyCsrfToken::class, IlluminateRoutingMiddlewareSubstituteBindings::class, >, "api" => < "throttle:60,1", "bindings", >,>;Đây là các middleware đã được gom nhóm lại và chúng ta cũng có thể dụng nó nhằm áp dụng cho các route của bạn. Khoác định thì toàn bộ các route chúng ta khai báo trong tệp tin web.php sẽ đều trải qua nhóm middleware website còn toàn thể route trong file api.php sẽ đi qua nhóm middleware api

protected $routeMiddleware = < "auth" => AppHttpMiddlewareAuthenticate::class, "auth.basic" => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class, "bindings" => IlluminateRoutingMiddlewareSubstituteBindings::class, "cache.headers" => IlluminateHttpMiddlewareSetCacheHeaders::class, "can" => IlluminateAuthMiddlewareAuthorize::class, "guest" => AppHttpMiddlewareRedirectIfAuthenticated::class, "signed" => IlluminateRoutingMiddlewareValidateSignature::class, "throttle" => IlluminateRoutingMiddlewareThrottleRequests::class, "verified" => IlluminateAuthMiddlewareEnsureEmailIsVerified::class,>;Còn đấy là các middleware cô đơn mà bạn cũng có thể sử dụng luôn luôn ở vào code của mình. Cơ phiên bản nhất là ở đây đã có sẵn middleware để kiểm tra câu hỏi người dung sẽ đăng nhập hay không là "auth" => AppHttpMiddlewareAuthenticate::class. Cũng chính vì thế trong middleware VerifyAccountBalance ta sẽ bỏ bớt phần kiểm tra người dùng đã đăng nhập đi như sau:

public function handle($request, Closure $next) if (Auth()::user()->getAccountBalance() > 50000) return $next($request); return redirect("home")->with("message", __("Some error message"));Lúc này trong tệp tin web.php phần khai báo route ta đang sửa lại một chút thành:

Route::group(<"middleware" => <"auth", "verfiy-account-balance">>, function() Route::get("get-list-movie", ""); Route::get("watch-movie", ""); Route::get("download-movie", ""); // 47 chức năng khác);Lưu ý sinh sống đây chúng ta có thể sử dụng mảng để có thể dùng các middleware đồng thời và sản phẩm tự chạy của các middleware đã theo vật dụng tự trong mảng.

5. Kết bài

Đến trên đây theo mình là đã bao gồm đủ các kiến thức cơ bạn dạng và hay sử dụng với middleware vào Laravel rồi buộc phải mình xin phép dừng nội dung bài viết ở đây. Nếu bạn muốn bố sung điều gì hoặc không hiểu nhiều phần nào gồm thể phản hồi ngay làm việc phía dưới. Cảm ơn các bạn đã phát âm và hãy nhờ rằng để lại một upvote nhé

*