Laravel Tutorial

Bài 4: Route trong Laravel – Phần 2

Tiếp tục với series Route trong Laravel, bài này chúng ta cùng tìm hiểu các tính năng khác liên quan đến route trong Laravel

1. Truyền tham số trong route

Trong Laravel để route có thể nhận tham số (parameter) thì bạn chỉ cần thêm cú pháp {name} vào trong $uri với name là định danh cho parameter đó

Route::get('user/{id}', function($id) {
   echo 'ID của user là: ' . $id;
});

Gõ địa chỉ: http://localhost:8080/user/1 trên trình duyệt sẽ được kết quả: ID của user là: 1

Ngoài ta chúng ta cũng có thể truyền nhiều tham số trong URL

Route::get('user/{name}/{age}/{address}', function($name, $age, $address) {
   echo 'Tên của user là: ' . $name. '<br>';
   echo 'Tuổi của user là: ' . $age. '<br>';
   echo 'Địa chỉ của user: ' . $address;
});

Gõ địa chỉ: http://localhost:8080/user/Lan/29/HCM trên trình duyệt sẽ được kết quả

Tên của user là: Lan
Tuổi của user là: 29
Địa chỉ của user là: HCM

Nếu bạn muốn truyền vào URL một parameter không bắt buộc thì bạn chỉ việc thêm dấu ? vào sau partern string. Và đồng thời cũng thêm giá trị default cho callback để khỏi vị lỗi code

Route::get('user/{id?}', function ($id = null) {
   if (!$id) {
      return "Xin mời nhập id";
   }
   return "User id: $id";
});

Kết quả

Trong trường hợp bạn muốn định dạng kiểu dữ liệu hay pattern của parameter thì bạn cần sử dụng phương thức where với cú pháp như sau:

where($name, $pattern)
or
where([$name => $pattern])

Trong đó

  • $name là parameter name.
  • $pattern là biểu thức regular expression.

Ví dụ: Nếu muốn idcommentId parameter trong ví dụ trên bắt buộc phải là số

Route::get('guest/{guestid}/comment/{commentid}', function($guestid, $commentid) {
   return "Guest ID: $guestid, Comment ID: $commentid";
})->where('guestid', '[0-9]+')->where('commentid', '[0-9]+');

Hoặc có thể viết

Route::get('guest/{guestid}/comment/{commentid}', function($guestid, $commentid) {
   return "Guest ID: $guestid, Comment ID: $commentid";
})->where(['guestid' => '[0-9]+', 'commentid' => '[0-9]+']);

Giờ nếu các bạn nhập một trong hai hoặc cả hai giá trị của parameter trên là chuỗi hoặc kí tự đặc biệt thì sẽ không matching với route này nữa.

Ngoài ra Laravel có cung cấp sẵn một số các phương thức where kèm với regex phổ biến như sau:

  • whereNumber($name): tương đương với where($name, '[0-9]+')
  • whereAlpha($name): tương đương với where($name, '[a-zA-Z]+')
  • whereAlphaNumeric($name): tương đương với where($name, '[a-zA-Z0-9]+')
  • whereUuid($name): tương đương với where($name, '[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}') (định dạng UUID)

Lúc này tất cả các route parameter được khai báo và thực thi sau Route::pattern sẽ hoạt động.

Ví dụ

Route::get('admin/{adminid}', function($adminid) {
   return "Admin ID: $adminid";
})->whereNumber('adminid');

Để hoạt động tốt nhất đối với tất cả các loại route thì bạn nên khai báo đoạn code dưới đây trong phương thức boot của file app/Providers/RouteServiceProvider.php

public function boot()
{
   Route::pattern('id', '[0-9]+');
}

2. Dependency injection với route

Dependency Injection là một thuật ngữ, chỉ việc giải quyết các phục thuộc của một object thông qua constructor

Dependency Request vào route:

Route::get('/users', function (Request $request) {
   // ...
});

Đối với các route có parameter các bạn sẽ phải để các tham số dependency phía trước, sau đố các parameter sẽ đặt sau các dependency

Route::get('user/{id}/comment/{commentId}', function (Request $request, $id, $commentId) {
   return "User id: $id and comment id: $commentId";
})->where(['id' => '[0-9]+', 'commentId' => '[0-9]+']);

3. Đặt tên cho route

Trong laravel có cho phép chúng ta đặt tên cho route để tiện cho việc quản lý và generate ra route URL. Để gán tên cho route thì bạn chỉ cần sử dụng phương thức name hoặc as với cú pháp như sau:

name($name)
// hoặc
as($name)

Trong đó $name là tên route muốn đặt

Ví dụ: Đặt tên cho route có path là /user/profile tên là profile

Route::get('/user/profile', function () {
   // Code
})->name('profile');

Hoặc

Route::get('/user/profile', function () {
   // Code
})->as('profile');

Đối với trường hợp bạn muốn đặt prefix cho tất cả route trong group thì bạn cũng sử dụng phương thức name hoặc as với cú pháp tương tự

Route::prefix('user')->name('user')->group(function () {
   Route::get('profile', function () {
      // Code
   })->name('profile');
   Route::get('setting', function () {
      // Code
   })->name('setting');
});

4. Generate URL sử dụng route name

Để tạo ra URL qua route name thì bạn sử dụng phương thức route() với cú pháp sau:

route($name, $parameter);

Trong đó:

  •  $name là tên của route.
  • $parameter là một mảng chưa các parameter truyền vào route. Nếu route không có parameter đó thì nó sẽ trở thành URL query string

File routes/web.php

//Tạo file PostController.php tại app/Http/Controller
Route::get('post', [\App\Http\Controllers\PostController::class, 'index'])->name('post_name'); 
Route::get('post/{id?}', [\App\Http\Controllers\PostController::class, 'index'])->name('post_id');

File app/Http/Controller/PostController.php

namespace App\Http\Controllers;
class PostController extends Controller
{
   public function index()
   {
      return view('post'); //Gọi đến post.blade.php tại resources/views
   }
}

File resources/views/post.blade.php

<body class="antialiased">
   <h2>URL trong Route</h2>
   <div>{{route('post_name')}}</div> <!--Không có parameter -> url sẽ là /post_name -->
   <div>{{route('post_id', ['id' => 10])}}</div> <!--Không có parameter -> url sẽ là /post_name/10 -->
</body>

Kết quả

Leave a Comment