Laravel cơ bản
Laravel nâng cao
Quảng cáo

Middleware trong Laravel

Trong hướng dẫn này chúng ta cùng đi tìm hiểu về Middleware trong Laravel 8 xem nó có tác dụng gì với các HTTP request trong ứng dụng Laravel của bạn

Ở bài Route trong Laravel (Cuối) bạn đã có được tìm hiểu về Middleware Route trong Laravel, nhưng bài đó chưa nói chi tiết về Middleware trong Laravel, bài này mình sẽ giới thiệu với mọi người về Middleware trong Laravel 8.

Middleware trong Laravel 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.

Khai báo middleware trong Laravel.

Để tạo middleware trong Laravel các bạn sử dụng command:

Ví dụ

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.

Ví dụ

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:

Ví dụ

<?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 'vzn.vn'.

Ví dụ

<?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') !== 'vzn.vn') {
            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à vzn.vn thì request sẽ được redirect về URL có path /home.

Đă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'.

Ví dụ

/**
 * 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ụ

Route::get('/user', function () {
    //
})->middleware('validate_token');

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.

Ví dụ

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.

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.

Ví dụ

<?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') !== 'vzn.vn') {
            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:

Ví dụ

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.

Bài viết này đã giúp ích cho bạn?

Advertisements