Middleware trong Laravel

Middleware hoạt động như một cầu nối giữa một yêu cầu (request) và một phản hồi (response). Nó là một loại cơ chế lọc. Bài này giải thích cho bạn cơ chế phần mềm trung gian trong Laravel.

Laravel có một middleware để xác minh xem người dùng của ứng dụng có được xác thực hay không. Nếu người dùng được xác thực, nó sẽ chuyển hướng đến trang chủ, nếu không, nó sẽ chuyển hướng đến trang đăng nhập.

Middleware có thể được tạo bằng cách thực hiện lệnh sau:

php artisan make:middleware <tên-middleware>
Thay thế <tên-middleware> bằng tên của middleware của bạn. middleware bạn tạo có thể được nhìn thấy trong thư mục app/Http/Middleware.

Ví dụ
Quan sát ví dụ sau để hiểu cơ chế middleware

Bước 1 - Bây giờ chúng ta hãy tạo AgeMiddleware. Để tạo nó, chúng ta cần thực hiện lệnh sau:
php artisan make:middleware AgeMiddleware

Bước 2 - Sau khi thực hiện thành công lệnh, bạn sẽ nhận được output như sau:

middleware trong laravel

Bước 3 - AgeMiddleware sẽ được tạo tại app/Http/Middleware. Các tập tin mới được tạo sẽ có mã sau đây đã được tạo cho bạn.
<?php
namespace App\Http\Middleware;
use Closure;
class AgeMiddleware
{
public function handle($request, Closure $next)
{
return $next($request);
}
}


Đăng ký Middleware

Chúng ta cần phải đăng ký Middleware trước khi sử dụng nó. Có hai loại Middleware trong Laravel.
  • Global Middleware
  • Route Middleware
Global Middleware sẽ chạy trên mọi yêu cầu HTTP của ứng dụng, trong khi đó routeMiddleware sẽ được gán cho một route cụ thể. Middleware có thể được đăng ký tại app/Http/Kernel.php. Tệp này chứa hai thuộc tính $middleware$routeMiddleware. Thuộc tính $middleware được sử dụng để đăng ký Global Middleware và thuộc tính $routeMiddleware được sử dụng để đăng ký route cho middleware cụ thể.

Để đăng ký Global Middleware , hãy liệt kê lớp ở cuối thuộc tính $middleware.

protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
Để đăng ký middleware cụ thể của route, hãy thêm khóa và giá trị vào thuộc tính $routeMiddleware.

protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];

Ví dụ
Chúng ta đã tạo AgeMiddleware trong ví dụ trước. Bây giờ chúng ta có thể đăng ký nó trong thuộc tính middleware cụ thể. Mã cho đăng ký đó được hiển thị dưới đây.

Sau đây là mã cho app/Http/Kernel.php

protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'Age' => \App\Http\Middleware\AgeMiddleware::class,
];


Các Tham số middleware

Chúng ta cũng có thể truyền tham số với Middleware. Ví dụ: nếu ứng dụng của bạn có các vai trò khác nhau như người dùng, quản trị viên, siêu quản trị viên, v.v. và bạn muốn xác thực hành động dựa trên vai trò, điều này có thể đạt được bằng cách chuyển tham số với middleware. Middleware mà chúng ta tạo chứa hàm sau đây và chúng ta có thể truyền đối số sau đối số $next.

public function handle($request, Closure $next) {
return $next($request);
}

Ví dụ
Bước 1 - Tạo RoleMiddleware bằng cách thực hiện lệnh sau:
php artisan make:middleware RoleMiddleware
Bước 2 - Sau khi thực hiện thành công, bạn sẽ nhận được output sau

middleware trong laravel


Bước 3 - Thêm mã sau đây vào phương thức xử lý của ứng dụng RoleMiddleware tại app/Http/Middleware/RoleMiddleware.php.
<?php
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware{
public function handle($request, Closure $next, $role) {
echo "Role: ".$role;
return $next($request);
}
}
Bước 4 - Đăng ký RoleMiddleware trong tệp app/Http/Kernel.php.

protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'Age' => \App\Http\Middleware\AgeMiddleware::class,
'Role' => \App\Http\Middleware\RoleMiddleware::class,
];

Bước 5: Thực thi lệnh sau để tạo TestController
php artisan make:controller TestController
Bước 6: Sau khi thực thi thành công bước 5, bạn sẽ nhận được output như sau:

middleware trong laravel

Bước 7: Copy những dòng lệnh sau vào file app/Http/TestController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class TestController extends Controller {
public function index() {
echo "<br>Test Controller.";
}
}

Bước 8: Thêm dòng lệnh sau vào file routes/web.php

Route::get('role',[
'middleware' => 'Role:editor',
'uses' => 'TestController@index',
]);

Bước 9: Mở trình duyệt nhập URL dưới đây và kiểm tra Middleware với các tham số
http://localhost:8000/role
Bước 10: Chương trình sẽ hiển thị như ảnh dưới đây

middleware trong laravel

Terminable Middleware

Terminable Middleware có thể thực hiện một số tác vụ sau khi phản hồi đã được gửi tới trình duyệt. Điều này có thể được thực hiện bằng cách tạo ra một Middleware với phương thức terminate trong Middleware. Terminable Middleware nên được đăng ký với Global Middleware. Phương thức terminate sẽ nhận được hai đối số $request$response. Phương thức terminate có thể được tạo như hiển thị trong đoạn mã sau.

Ví dụ
Bước 1 - Tạo TerminatingMiddleware bằng cách thực hiện lệnh bên dưới.
php artisan make:middleware TerminateMiddleware
Bước 2 - Bước 1 sẽ tạo ra output như sau:

middleware trong laravel

Bước 3: Copy đoạn mã sau vào TerminateMiddleware vừa tạo tại app/Http/Middleware/TerminateMiddleware.php.
<?php
namespace App\Http\Middleware;
use Closure;
class TerminateMiddleware {
public function handle($request, Closure $next) {
echo "Executing statements of handle method of TerminateMiddleware.";
return $next($request);
}
public function terminate($request, $response) {
echo "<br>Executing statements of terminate method of TerminateMiddleware.";
}
}

Bước 4: Đăng ký TerminateMiddleware tại file app\Http\Kernel.php
middleware trong laravel

Bước 5 − Thực thi lệnh sau để tạo ABCController.
php artisan make:controller ABCController
Bước 6 − Sau khi thực thi thành công, bạn sẽ nhận được output như sau:

middleware trong laravel

Bước 7: Copy những dòng lệnh sau vào file app/Http/ABCController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class ABCController extends Controller {
public function index() {
echo "<br>ABC Controller.";
}
}

Bước 8: Thêm dòng lệnh sau vào file routes/web.php

Route::get('terminate',[
'middleware' => 'terminate',
'uses' => 'ABCController@index',
]);

Bước 9: Mở trình duyệt nhập URL dưới đây và kiểm tra Middleware với các tham số
http://localhost:8000/terminate

Bước 10: Chương trình sẽ hiển thị như ảnh dưới đây

middleware trong laravel