Laravel Tutorial

Bài 14: Middleware trong Laravel

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