Middleware hoạt động như một cầu nối giữa yêu cầu và phản hồi, nó là một loại cơ chế lọc. Chương này giải thích cho bạn cơ chế Middleware trong Laravel.
Laravel bao gồm 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 <middleware-name>
Thay <middleware-name> bằng tên phần mềm trung gian của bạn. Phần mềm trung gian mà bạn tạo có thể được nhìn thấy tại thư mục app/Http/Middleware .
Thí dụ
Quan sát ví dụ sau để hiểu cơ chế của Middleware:
Bước 1 – Bây giờ chúng ta hãy tạo AgeMiddleware. Để tạo điều đó, 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 đầu ra sau :
Bước 3 – AgeMiddleware sẽ được tạo tại app/Http/Middleware . Tệp mới được tạo sẽ có mã sau đây đã được tạo sẵn 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 đăng ký từng 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 Route Middleware sẽ được chỉ định cho một tuyến 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 và $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ý Middleware gian cụ thể của Route .
Để đăng ký phần Global Middleware, hãy liệt kê lớp ở cuối thuộc tính $middleware.
protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ];
Để đăng Middleware cụ thể của Router, 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, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, ];
Thí dụ
Chúng tôi đã 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ể của Router. Mã cho đăng ký đó được hiển thị bên dưới.
Sau đây là mã cho app/Http/Kernel.php −
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ]; protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'Age' => \App\Http\Middleware\AgeMiddleware::class, ]; }
Tham số phần mềm trung gian
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, quản trị viên cấp cao, 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ố bằng Middleware. Middleware mà chúng tôi tạo chứa chức năng sau và chúng tôi có thể chuyển đối số tùy chỉnh của mình sau đối số $next .
public function handle($request, Closure $next) { return $next($request); }
Thí 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 đầu ra sau –
Bước 3 – Thêm mã sau vào phương thức xử lý của ứng dụng RoleMiddlewareat mới được tạo/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 . Thêm dòng được đánh dấu bằng màu xám trong tệp đó để đăng ký RoleMiddleware.
Bước 5 – Thực hiện lệnh sau để tạo TestController –
php artisan make:controller TestController --plain
Bước 6 – Sau khi thực hiện thành công bước trên, bạn sẽ nhận được đầu ra sau –
Bước 7 – Sao chép các dòng mã sau vào tệp app/Http/TestController.php .
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 mã sau vào tệp app/Http/routes.php .
app/Http/routes.php
Route::get('role',[ 'middleware' => 'Role:editor', 'uses' => 'TestController@index', ]);
Bước 9 – Truy cập URL sau để kiểm tra Middleware với các tham số
http://localhost:8000/role
Bước 10 – Đầu ra sẽ xuất hiện như trong hình dưới đây.
Terminable Middleware
Middleware có thể kết thúc 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 một phần mềm trung gian với phương thức kết thúc trong phần mềm trung gian. Phần mềm trung gian có thể kết thúc phải được đăng ký với phần Global Middleware. Phương thức kết thúc sẽ nhận được hai đối số $request và $response. Phương thức kết thúc có thể được tạo như trong đoạn mã sau.
Thí dụ
Bước 1 – Tạo TerminateMiddleware bằng cách thực hiện lệnh bên dưới.
php artisan make:middleware TerminateMiddleware
Bước 2 – Bước trên sẽ tạo ra đầu ra sau –
Bước 3 – Sao chép mã sau vào TerminateMiddleware mới được 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 trong tệp app\Http\Kernel.php . Thêm dòng được đánh dấu bằng màu xám trong tệp đó để đăng ký TerminateMiddleware.
Bước 5 – Thực hiện lệnh sau để tạo ABCController .
php artisan make:controller ABCController --plain
Bước 6 – Sau khi thực hiện thành công URL, bạn sẽ nhận được đầu ra sau –
Bước 7 – Sao chép đoạn mã sau vào tệp app/Http/ABCController.php .
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 mã sau vào tệp app/Http/routes.php .
app/Http/routes.php
Route::get('terminate',[ 'middleware' => 'terminate', 'uses' => 'ABCController@index', ]);
Bước 9 – Truy cập URL sau để kiểm tra Middleware có thể kết thúc.
http://localhost:8000/terminate
Bước 10 – Đầu ra sẽ xuất hiện như trong hình dưới đây.