Tiếp tục với route trong Laravel, bài này mình sẽ giới thiệu tiếp với mọi người 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 đó.
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 "Xin mời nhập id";
}
return "User id: $id";
});
Kết quả:
Bạn cũng có thể sử dụng nhiều parameter trong route.
VD:
Route::get('user/{id}/comment/{commentId}', function ($id, $commentId) {
return "User id: $id and comment id: $commentId";
});
Kết quả:
Trong ví dụ trên bạn có nhập id
, commenId
là chữ hay số hay là một kí tự đặc biệt nào đó thì route đó vẫn matching.
VD:
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 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 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ớ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: 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ữ, chỉ việc giải quyết các phục thuộc của một object thông qua constructor (vấn đề này mình sẽ nói chi tiết ở một bài khác).
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ó 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.
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]+']);
Nếu bạn chưa hiểu phần này thì cũng đừng lo, mình sẽ giới thiệu chi tiết về nó trong một bài khác.
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 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ự.
VD: 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');
});
VD: 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 parameter truyền vào route. Nếu route không có parameter đó 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.
Đọc đến đây bạn đã thấy laravel hỗ trợ route rất mạnh đúng không? Nhưng chưa hết đâu, phần sau mình sẽ tiếp tục giới thiệu với mọi người các tính năng khác nữa.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
0 Comments