Laravel Tutorial

Bài 5: Route trong Laravel – Phần 3

Tiếp tục với route trong Laravel 8, phần này chúng ta sẽ tìm hiểu về middleware route, subdomain route, binding model route …

1. Middleware Route

Middleware là một khái niệm chỉ việc cung cấp ra các bộ filter HTTP request cho ứng dụng. Để thêm middleware cho một route các bạn sử

dụng phương thức middleware() với cú pháp:

middleware($middleware)

Trong đó: $middleware là một string, array chứa middleware name

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

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

Để hiểu rõ hơn về middleware bạn xem thêm bài viết sau: Middleware trong laravel

2. Subdomain Route

Trong một số trường hợp bạn muốn sử dụng route cho subdomain thì bạn sử dụng phương thức domain với cú pháp như sau:

domain($domain)

Trong đó $domain là subdomain bạn cần xử lý

Ví dụ

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

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

Trong laravel, khi chúng ta muốn hiển thị ra hoặc sửa một bài viết hay một thông tin nào đó ta thường truyền vào id của bài viết đó rồi dùng controller truy xuất ra bài viết qua hàm find() của model tương ứng. Nhưng Laravel đã hỗ trợ chúng ta kết nối giữa model và route để công việc truy xuất dữ liệu trở nên thuận tiện và dễ dàng hơn. Để biết rõ cách dùng tính năng này thế nào chúng ta cùng tìm hiểu cơ chế Route Model Binding trong laravel nhé!

Laravel models binding cung cấp một cách thuận tiện để đẩy model vào route. Thay vì đẩy ID của người dùng ta có thể đẩy toàn bộ model User phù hợp với ID xác định được truyền vào route

Ví dụ 1:

Route::get('view/{id?}', function($id = 0) {
   $post = App\Post::find($id);
   if (!$post) {
      return abort('404');
   }
   return view('post.view', ['post' => $post]);
});

Thay vào việc viết code như cách ‘truyền thống’ (bên trên) chúng ta viết như sau:

Route::get('view/{post?}', function (App\Post $post) {
   return view('post.view', ['post' => $post]);
});

Trong ví dụ này, Eloquent đã gợi ý biến $post định nghĩa trong route phù hợp với {post} trong URI. Laravel tự động đẩy đối tượng Model và có ID phù hợp với giá trị tương ứng từ URI vào.

Nếu không tìm thấy trong cơ sở dữ liệu, một phản hồi 404 HTTP sẽ tự động được tạo ra.

Ví dụ 2:

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 và 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 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 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ụ về csrf_token()

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

Ví dụ với csrf_field()

csrf_field();
// Output: <input type="hidden" name="_token" value="jtjDHciPJs0riuoHAEHGYNkxdF1DARv5xo9oVOg2">

Bạn có thể sử dụng @csrf để generate ra trường token ẩn

<form method="POST" action="/profile">
   @csrf
   <!-- Equivalent to... -->
   <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>

5. Route Cache

Laravel xử lí route cũng tương đối là nặng và cồng kềnh thế nên laravel 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 sau:

php artisan route:clear

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

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

Ngoài ra 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.

Ví dụ:

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 route có 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

 

Leave a Comment