Trong bài tiếp theo về route trong Laravel này chúng mình sẽ cùng tìm hiểu các khái niệm, tính năng liên quan của route trong Laravel 8 đặc biệt là học cách sử dụng route qua các ví dụ nhé!
1. Truyền tham số trong route.
Trong Laravel 8 để 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 đó.
VD:
Route::get('user/{id}', function ($id) {
return "User id: $id";
});
Kết quả:
Tuy nhiên nếu bạn vào không truyền user id vào trong URL thì laravel sẽ trả về 404 vì không có parameter.
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.
VD: Chuyển id parameter ở ví dụ trên về dạng optional.
Route::get('user/{id?}', function ($id = null) {
if (!$id) {
return "Bạn hãy nhập vào id";
}
return "User id: $id";
});
Kết quả:
Bạn cũng có thể sử dụng nhiều tham số trong route.
VD:
Route::get('user/{id}/comment/{commentId}', function ($id, $commentId) {
return "User id: $id and comment id: $commentId";
});
Tham số có thể là chữ hay số hay là một kí tự đặc biệt nào đó thì route đó vẫn không lỗi vì ta không định dạng kiểu dữ liệu cho tham số.
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.
VD: Mình muốn id
, commentId
parameter trong ví dụ trên bắt buộc phải là số.
Route::get('user/{id}/comment/{commentId}', function ($id, $commentId) {
return "User id: $id and comment id: $commentId";
})->where('id', '[0-9]+')->where('commentId', '[0-9]+');
Hoặc các bạn có thể truyền array vào phương thức where
theo cách này:
Route::get('user/{id}/comment/{commentId}', function ($id, $commentId) {
return "User id: $id and comment id: $commentId";
})->where(['id' => '[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 8 còn 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ớiwhere($name, '[0-9]+')
whereAlpha($name)
: tương đương vớiwhere($name, '[a-zA-Z]+')
whereAlphaNumeric($name)
: tương đương vớiwhere($name, '[a-zA-Z0-9]+')
whereUuid($name)
: tương đương vớiwhere($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)
Nếu như bạn muốn định nghĩa pattern cho tất cả route parameter name nào đó. Bạn có thể sử dụng:
Route::pattern($name, $pattern);
Trong đó:
$name
là parameter name.$pattern
là biểu thức regular expression.
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. Để 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 trong phương thức boot
của file app/Providers/RouteServiceProvider.php
VD: Khai báo tất cả các route có parameter name là id sẽ đều phải là số.
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
}
2. Dependency injection với route.
Dependency Injection là một thuật ngữ dùng chỉ việc giải quyết các phục thuộc của một object thông qua constructor. Trong Laravel dependency injection xuất hiện ở mọi nơi và đương nhiên đối với callback trong route cũng có.
VD: Dependency Request vào route.
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('/users', function (Request $request) {
// ...
});
Đối với các route có tham số các bạn sẽ phải để các tham số dependency phía trước, sau đó các tham số sẽ đặt sau các dependency.
VD:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
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.
Laravel 8 cũng 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 mà bạn muốn đặt.
VD: Đặt tên cho route có path là /user/profile
tên là profile.
Route::get('/user/profile', function () {
//
})->name('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 as
hoặc name
với cú pháp tương tự.
Ví Dụ: Với phương thức as
Route::prefix('user')->as('user.')->group(function () {
Route::get('profile', function () {
//
})->name('profile');
Route::get('setting', function () {
//
})->name('setting');
});
Ví Dụ: Với phương thức name
.
Route::prefix('user')->name('user.')->group(function () {
Route::get('profile', function () {
//
})->name('profile');
Route::get('setting', function () {
//
})->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 tham số truyền vào route. Nếu route không có tham số đó thì nó sẽ trở thành URL query string.
VD:
routes/web.php
use Illuminate\Support\Facades\Route;
Route::get('/welcome')->name('welcome');
Route::prefix('user')->as('user.')->group(function () {
Route::get('profile', function () {
//
})->name('profile');
Route::get('post/{id}', function () {
//
})->name('show.post');
});
Với route như trên thì generate URL qua route()
sẽ có dạng như sau:
route('home')
// http://example.com/welcome
route('user.profile')
// http://example.com/user/profile
route('user.show.post', ['id' => 10]);
// http://example.com/user/post/10
route('user.profile', ['id' => 10]);
// http://example.com/user/profile?id=10
5. Lời kết.
Laravel hỗ trợ route mạnh và laravel 8 còn hỗ trợ route mạnh hơn. Còn nhiều tính năng khác của route laravel 8 thế nhưng bài hơi dài rồi vì vậy hẹn gặp các bạn ở bài sau nhé!