0

Middleware trong Laravel

Dù đã lâu rồi không code, nhưng thi thoảng vẫn ngứa nghề, nên hôm nay mình lên 1 bài về Coding 1 xíu, nhân có 1 bạn hỏi về middleware. Chúng ta sẽ cùng xem xét sâu hơn 1 chút về middleware của Laravel.

Middleware là gì ?

Nhắc lại 1 chút, middleware là những đoạn code logic nằm giữa request và logic phía server. Đây thường là những đoạn logic nhỏ, có tính lặp lại thường xuyên, được sử dụng trong quá trình authentication xác thực người dùng logic.

Middleware trong Laravel

Trong Laravel, middleware được viết nằm trong thư mục App/Http/Middleware. Có 1 số middleware đã được tạo sẵn khi các bạn tạo project. Nếu muốn tạo 1 middleware riêng của mình, thì có thể chạy lệnh : php artisan make:middleware <tên middleware>

Việc viết middleware như nào thì rất tiếc bài viết này hơi ngắn, không thể hướng dẫn các bạn chi tiết được nên mình sẽ hướng dẫn trên một nền tảng khác vào dịp khác vậy.

Kernel

Kernel trong Laravel là 1 file đặc biệt, dùng để khai báo các loại middleware các bạn vừa viết ra ở phần trên. Trong Kernel, có 3 biến lưu các loại middleware chúng ta cần nhớ, đó là:

  • middleware: đây là nơi lưu trữ các middleware sẽ được chạy trong tất cả các request.
  • middlewareGroups: đây là nơi lưu trữ các middleware được nhóm lại thành các group, chúng ta có thể sử dụng 1 group các middleware bằng cách gọi tên tại vị trí này.
  • routeMiddleware: đây là nơi khai báo các middleware route lẻ, mỗi middleware sẽ có 1 tên riêng, và có thể kết hợp nhau (tương tự middlewareGroup).

Sau khi đã có middleware và gán tên tương ứng trong Kernel. Chúng ta có thể sử dụng middleware đó tại thư mục routes.

Tại thư mục routes, thông thường, mỗi một đường dẫn link tới 1 action cụ thể như get/post/put/delete/... chúng ta hay viết như sau:

Route::post('/account/login', [AccountController::class, "login"]);

Đối với những đường dẫn mong muốn đi qua middleware, chúng ta sẽ đưa đoạn code khai báo route vào trong hàm của middleware:

Route::group(['middleware' => ['api']], function () {
Route::post('/account/logout', [AccountController::class, "logout"]);

Ở đây, chúng ta đang nhìn thấy hàm Route thông thường đã được wrap ở trong 1 hàm tên là : group(). Tại hàm group, chúng ta khai báo tên middleware mong muốn sử dụng theo format trên, và khai báo function chứa các Route khai báo phía trong. Như vậy khi nhận được request POST /account/logout , request sẽ được đi qua middleware xử lý trước, rồi mới tiếp tục đi vào trong các hàm Controller khai báo phía trong.

Đối với trường hợp muốn sử dụng các middleware lẻ, chúng ta sử dụng như sau:

Route::post('/account/login', [AccountController::class, 'login'])
->middleware(['first', 'second'])

Lưu ý là dù với tên middleware 'first', 'second', nhưng điều này không đảm bảo là middleware của chúng ta sẽ chạy theo thứ tự (Trong thực tế, các middleware khác nhau sẽ làm nhiệm vụ khác nhau và ít khi cần phụ thuộc vào nhau). Tuy nhiên với một số trường hợp, cần sử dụng thứ tự của middleware, chúng ta có thể khai báo trong middlewarePriority trong Kernel. Link tới https://laravel.com/docs/8.x/middleware#sorting-middleware để biết thêm chi tiết cách sử dụng


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí