Bài 5: Laravel – Middleware
Định nghĩa Middleware Nghe tên đã dự đoán được, Middleware hoạt động như một tên “bê đê” trung gian giữa request và response. Nó là một kiểu dạng sàn lọc(filtering). Lấy ví dụ, Laravel include một middleware mà để xác nhận có user đã chứng thực hay chưa. Nếu user đã chứng ...
Định nghĩa Middleware
Nghe tên đã dự đoán được, Middleware hoạt động như một tên “bê đê” trung gian giữa request và response. Nó là một kiểu dạng sàn lọc(filtering). Lấy ví dụ, Laravel include một middleware mà để xác nhận có user đã chứng thực hay chưa.
Nếu user đã chứng thực, anh ta sẽ được chuyển đến home page, mặc khác anh ta sẽ được chuyển vào trang login.
Middleware có thể được tạo bằng cách thực thi câu lệnh sau:
php artisan make:middleware <middleware-name>
Thay thế <middleware-name> với tên bạn muốn. Middleware mà bạn tạo có thể tìm thấy trong app/Http/Middleware.
EX:
Step 1: Bây giờ chúng ta tạo AgeMiddleware. Để tạo nó, chúng ta cần thực thi command sau:
php artisan make:middleware AgeMiddleware
Step 2: Sau khi thành công, bạn sẽ thấy output như sau:
Step 3: AgeMiddleware sẽ tạo ở app/Http/Middleware. File mới được tạo sẽ có tạo sẳn đoạn code sau:
Register Middleware
Chúng ta cần đăng ký mổi middleware tạo ra trước khi sử dụng nó. Có 2 loại Middleware trong Laravel.
- Global Middleware
- Route Middleware
Global Middleware sẽ chạy trong mổi HTTP request, trong khi Route Middleware sẽ được phân công tới một route xác định.
Middleware có thể được đăng ký tại app/Http/Kernel.php. File này chứa 2 thuộc tính $middleware và $routeMiddleware. $middleware được sử dụng để đăng ký Global Middleware và $routeMiddleware được sử dụng để đăng ký route middleware xách định.
Để đăng ký global middleware, ta liệt kê các class ở cuối thuộc tính $middleware
protected $middleware = [
IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
AppHttpMiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
AppHttpMiddlewareVerifyCsrfToken::class,
];
Để đăng ký middleware xác định, thêm key và value tới thuộc tính $routeMiddleware.
protected $routeMiddleware = [
‘auth’ => AppHttpMiddlewareAuthenticate::class,
‘auth.basic’ => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
‘guest’ => AppHttpMiddlewareRedirectIfAuthenticated::class,
];
Ví dụ
Chúng ta đã tạo AgeMiddleware trong ví dụ trước. Chúng ta có thể đăng ký nó trong thuộc tính middleware xác định (route middleware) như sau:
Mở file app/Http/Kernel.php tìm đến thuộc tính $routeMiddleware và đăng ký thêm dòng middleware vừa tạo.
protected $routeMiddleware = [
‘auth’ => AppHttpMiddlewareAuthenticate::class,
‘auth.basic’ => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
‘guest’ => AppHttpMiddlewareRedirectIfAuthenticated::class,
‘Age’ => AppHttpMiddlwareAgeMiddleware::class,
];
Middleware Parameters
Chúng ta cũng có thể đưa đối số trong Middleware. Lấy ví dụ, nếu ứng dụng của bạn có các vai trò khác nhau như: user, admin, super admin v.v…và bạn muốn chứng thực hoạt động dựa vào vài trò, thẩm quyền, điều này có thể đạt được bằng cách chuyển đối số với middleware. Middleware mà chúng ta tạo chứa đựng một function và chúng ta có thể chuyển đối số của chúng ta sau đối số $next.
public function handle($request, Closure $next) {
return $next($request);
}
Ví dụ
Step 1: tạo RoleMiddleware
php artisan make:middleware RoleMiddleware
Step 2: nếu thành công thì bạn sẽ thấy
Step 3: thêm code sau trong phương thức handle của file RoleMiddleware vừa mới tạo ở app/Http/Middleware/RoleMiddleware.php.
Step 4: Đăng ký RoleMiddleware trong appHttpKernel.php. Thêm dòng có màu đỏ vào file đó như hình dưới:
Step 5: thực thi câu lệnh sau để tạo TestController
php artisan make:controller TestController
Step 6: nếu thành công bạn sẽ thấy:
Step 7: copy code sau vào app/Http/TestController.php
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppHttpRequests;
class TestController extends Controller
{
//
public function index(){
echo “<br>Test Controller.”;
}
}
Step 8: thêm dòng sau trong routes/web.php. (phiên bản cũ là app/Http/routes.php)
Route::get(‘role’,[
‘middleware’ => ‘Role:editor’,
‘uses’ => ‘TestController@index’,
]);
Step 9: chạy URL sau để test Middleware với đối số
http://localhost:8000/role
Step 10: kết quả thành công như sau:
Rồi các bạn làm búa lua xua nãy giờ, bây giờ kết quả ra vậy có biết nó từ đâu ko? Để tránh các bạn vừa coi vừa làm theo rồi lại quên, tôi sẽ tóm lại để các bạn khỏi mắc công suy nghĩ, vì ngồi học lâu nó sẽ khôn ít đi xíu hehe.
Ok!, trong file RoleMiddleware.php chúng ta truyền vào thêm một đối số là $role và đồng thời echo nó : echo “Role: “.$role; Đây là cách truyền đối số qua middleware.
Đó chính là kết quả trả về “Role: editor” như hình các bạn thấy.
Kết tiếp là dòng ‘uses’ => ‘TestController@index’ trong route, ý nghĩa là sẽ chạy vào file controller TestController và tìm phương thức index để chạy, tên file controller và phương thức ngăn cách bởi dấu @ .
Terminable Middleware
Terminable middleware thực hiện một số nhiệm vụ sau khi response được gửi tới browser. Điều này có thể hoàn thành bằng việc tạo một middleware với phương thức “terminate” trong middleware. Terminable middleware nên đăng ký với global middleware. Phương thức terminate sẽ nhận 2 đối số $request và $response. Phương thức terminate có thể được tạo như code ví dụ dưới đâu:
EX:
Step 1: Tạo TerminateMiddleware bằng lệnh sau:
php artisan make:middleware TerminateMiddleware
Step 2:
Step 3: copy code sau vào file mới tạo TerminateMiddleware trong app/Http/Middleware/TerminateMiddleware.php.
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.”;
}
Step 4: đăng ký TerminateMiddleware trong appHttpKernel.php. Thêm dòng màu đỏ như hình:
Step 5: tạo ABCController.
php artisan make:controller ABCController
Step 6: không có j trở ngại thì :
Step 7: Copy code dưới vào app/Http/ABCController.php.
Trong class ABCController ta tạo hàm index
class ABCController extends Controller
{
//
public function index(){
echo “<br>ABC Controller.”;
}
}
Step 8: Định tuyến terminate trong routes/web.php.
Route::get(‘terminate’,[
‘middleware’ => ‘terminate’,
‘uses’ => ‘ABCController@index’,
]);
Step 9: chạy url sau: http://localhost:8000/terminate
Step 10: và đây là kết quả: