01/10/2018, 15:39

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:

bai5_create_middleware

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:

bai5_middleware_new_code_file

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 $routeMiddleware. $middleware được sử dụng để đăng ký Global Middleware $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

bai5_create_rolemiddleware

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.

bai5_rolemiddleware_code_handle_function

Step 4: Đăng ký RoleMiddleware trong appHttpKernel.php. Thêm dòng có màu đỏ vào file đó như hình dưới:

bai5_register_middleware

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:

bai5_create_controller_test

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:

bai5_output_parrameter_middleware

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 $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:

bai5_create_terminate_middleware

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:

bai5_register_terminate_middleware

Step 5: tạo ABCController.

php artisan make:controller ABCController

Step 6: không có j trở ngại thì :

bai5_create_controller_abc

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ả:

bai5_output_terminatemiddleware

0