Middleware route, CSRF token trong Route

Phần cuối cùng của loạt bài Route trong Laravel 8 này chúng ta sẽ nghiên cứu về middleware route, cách hiển thị tất cả các route ...  tất cả những gì chưa kịp nhắc đến về route trong các bài trước các bạn nhé1

1. Middleware Route.

Middleware là một khái niệm chỉ việc cung cấp các bộ filter HTTP request cho ứng dụng. Ví dụ như khi người dùng tạo một POST request đến path /user/create thì sẽ loại bỏ các khoảng trống trong dữ liệu gửi lên.

Để thêm middleware cho một route chúng ta sử dụng phương thức middleware() với cú pháp:

middleware($middleware)

Trong đó: $middleware  có thể là một chuỗi, mảng chứa middleware name.

Ví Dụ: Thêm middleware auth cho request /user/profile.

Route::middleware(['auth'])->group(function () {
    Route::get('/user/profile', function () {
        //
    });
});

2. Subdomain Route.

Nếu bạn muốn sử dụng route cho subdomain thì chỉ cần sử dụng phương thức domain với cú pháp như sau:

domain($domain)

Trong đó: $domain là domain của bạn muốn handle.

VD:

Route::domain('{account}.hoc.tv')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

Lưu ý: Để route subdomain hoạt động thì bạn phải thiết lập subdomain trên webserver trước đã.

3. Binding Model Trong Route.

Laravel tự động resolve eloquent model nếu như bạn định nghĩa chúng trong route hoặc phương thức trong controller.

Ví Dụ: Auto resolve User theo route.

use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    return $user->email;
});

Lúc này khi bạn truyền {user} thì laravel sẽ resolve model với {user} tương ứng với primary key trong model, ngược lại nó sẽ trả về 404 nếu {user} không có trong database.

4. CSRF token trong Route.

Mặc định route trong Laravel được enable middleware VerifyCsrfToken (app/Http/Middleware/VerifyCsrfToken.php) chính vì thế tất cả các request khác HEAD, GET và OPTIONS đều cần phải có token kèm theo. Nếu không có token kèm theo thì Laravel sẽ trả về http status code là 419.

Laravel 8 cho phép các bạn binding token vào request qua một trong các cách thức sau:

  • Truyền vào trong http header với header name là X-XSRF-TOKEN.
  • Truyền vào trong parameter string với name là _token.

Để sinh CSRF token trong Laravel 8 các bạn sử dụng hàm csrf_token(). Nếu như bạn cần sinh ra html input token thì bạn có thể sự dụng hàm csrf_field().

Ví Dụ: csrf_token().

<form action="/example" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

Ví Dụ: csrf_field().

csrf_field();

// Output: <input type="hidden" name="_token" value="jtjDHciPJs0riuoHAEHGYNkxdF1DARv5xo9oVOg2">

Ngoài ra bạn có thể sử dụng blade directive để sinh ra token_field() với directive @csrf

Ví Dụ:

<form action="/example" method="POST">
    @csrf
</form>

5. Route Cache.

Quá trình xử lý route cũng tương đối là nặng và cồng kềnh thế nên laravel 8 có cung cấp một feature cho phép chúng ta cache lại thông tin route vào một file. File này sẽ nằm ở trong bootstrap/cache/

Để cache route các bạn sử dụng command:

php artisan route:cache

Khi route đã được cache, laravel sẽ load data trong file cache ra mà không quan tâm đến file route nữa. Chính vì thế bạn có sửa gì trong route laravel cũng sẽ không nhận nữa. Để apply lại route mới bạn cần run lại lệnh cache một lần nữa. Hoặc clear route cache rồi cache lại.

Để clear route cache trong Laravel 8 các bạn sử dụng lệnh:

php artisan route:clear

6. Hiển thị danh sách route.

Để hiển thị ra danh sách route đã được đăng kí trong Laravel các bạn sử dụng câu lệnh:

php artisan route:list

VD:                              

λ php artisan route:list                                           
+--------+----------+--------------+------+---------+------------+ 
| Domain | Method   | URI          | Name | Action  | Middleware | 
+--------+----------+--------------+------+---------+------------+ 
|        | GET|HEAD | /            |      | Closure | web        | 
|        | GET|HEAD | api/greeting |      | Closure | api        | 
|        | GET|HEAD | api/user     |      | Closure | api        | 
|        |          |              |      |         | auth:api   | 
|        | GET|HEAD | user/{id?}   |      | Closure | web        | 
|        | GET|HEAD | welcome      |      | Closure | web        | 
+--------+----------+--------------+------+---------+------------+ 

Ngoài ra các bạn có thể thêm các option khác như:

  • --columns=[Column] chọn các cột hiển thị.
  • --compact chỉ hiển thị cột method, URI và Action.
  • --json xuất data dưới dạng json.
  • --method=[Method] lọc các route theo method.
  • --name[=NAME] lọc theo route name.
  • --path[=PATH] lọc theo path.
  • --reverse đảo ngược thứ tự sắp xếp route.
  • --sort[=SORT] sắp xếp route theo column. Default là sắp xếp theo URI.

7. Lấy route hiện tại.

Trong một số trường hợp bạn cần lấy ra thông tin của route hiện tại thì Laravel 8 cung cấp cho chúng ta 3 phương thức để lấy ra thông tin.

  • Route::current() - Lấy ra current route dạng object (Illuminate\Routing\Route).
  • Route::currentRouteName() - Lấy ra current route name. Nếu route không set name thì nó sẽ trả về null.
  • Route::currentRouteAction() - Lấy ra current action của route. Cái này chỉ work nếu bạn sử dụng Controller làm action cho route.

8. Lời kết.

Đến đây những gì mình tìm hiểu về route trong Laravel 8 đã trình bày hết với các bạn rồi. Còn thiếu gì các bạn comment mình sẽ bổ xung sau nhé. Cảm ơn các bạn đã theo dõi!

Bình luận