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 id
, commentId
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ớ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)
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