Hãy nói về một cách khác để định tuyến các tham số trong Laravel. Chúng ta đã thấy cách lấy các tham số bằng dấu hỏi, như ?category_id=XXXXX. Một cách thông thường hơn là có các tham số bên trong URL, như domain.com/posts/1234, trong đó 1234 là ID của bài viết hoặc một tham số khác.
Hãy tạo trang cho bài viết cá nhân. Bạn sẽ thấy cách lấy tham số đó từ URL và truy vấn dữ liệu từ DB bằng Eloquent. Ngoài ra, chúng ta sẽ tìm hiểu về một chức năng tiện lợi của Laravel là Ràng Buộc Model Route.
Controller và Tham Số Route
Đầu tiên, hãy tạo một Controller sẽ chịu trách nhiệm cho các bài viết.
php artisan make:controller PostController
Trong Controller, chúng ta sẽ có một phương thức show() với tham số $postId.
app/Http/Controllers/PostController.php:
class PostController extends Controller
{
public function show($postId)
{
//
}
}
Bên trong phương thức show(), chúng ta sẽ sử dụng phương thức find() của Eloquent Model và truyền vào $postId để tự động tìm bài viết theo ID của nó. Sau đó, chúng ta sẽ trả về một View gọi là post.blade.php và truyền bài viết $post vào đó.
app/Http/Controllers/PostController.php:
use App\Models\Post;
class PostController extends Controller
{
public function show($postId)
{
$post = Post::find($postId);
return view('post', compact('post'));
}
}
Tạo một View post.blade.php: chỉ cần mở about.blade.php, làm File -> Save as, và thay đổi phần nội dung ở giữa.
resources/views/post.blade.php:
Bây giờ, làm thế nào để bạn đưa nó vào Route? Làm thế nào để bạn sử dụng tham số đó?
Khi định nghĩa URL cho Route, tham số được đặt bên trong dấu ngoặc nhọn:
Route::get('posts/{postId}', [SomeController::class, 'some_method']);
Tên tham số postId trong Route phải giống với tên biến được sử dụng trong phương thức của controller.
Vì vậy, chúng ta thêm route đó ở cuối, cũng đặt tên cho nó, như trong trường hợp của các route trước.
routes/web.php:
Route::view('/', 'home')->name('home');
Route::get('/', [\App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::view('contact', 'contact')->name('contact');
Route::view('about', 'about')->name('about');
Route::get('posts/{postId}', [\App\Http\Controllers\PostController::class, 'show'])->name('post.show');
Hãy truy cập URL, /posts/1, cho bài viết đầu tiên. Chúng ta sẽ thấy tiêu đề và nội dung của bài viết đầu tiên!
Ràng Buộc Model Route
Trong những trường hợp như vậy, khi tìm kiếm bản ghi riêng lẻ theo ID của nó, Eloquent có một giải pháp tốt hơn. Thay vì postId, bạn có thể truyền post, cái mà sẽ được coi như một đối tượng.
routes/web.php:
Route::get('posts/{post}', [\App\Http\Controllers\PostController::class, 'show'])->name('post.show');
Sau đó, trong Controller, bạn gợi ý kiểu rằng đó là một đối tượng Model bài viết và định nghĩa tham số là $post. Và sau đó, việc tìm kiếm DB được thực hiện tự động bởi Laravel dưới lớp nền. Bạn không cần phải gọi find().
app/Http/Controllers/PostController.php:
use App\Models\Post;
class PostController extends Controller
{
public function show(Post $post)
{
return view('post', compact('post'));
}
}
Làm mới trang, và nó vẫn hoạt động!
Vì vậy, cách thực hiện các route này được gọi là Ràng Buộc Model Route vì nó ràng buộc Model bằng cách gợi ý kiểu đối tượng Model với tham số trong Route. Và nó sẽ tự động hiển thị trang 404 nếu bản ghi không tồn tại.
Liên Kết Đến Trang
Cuối cùng, sử dụng Route post.show này và tạo liên kết đến trang đó. Chúng ta cần thêm nó vào home.blade.php, nơi chúng ta lặp qua tất cả các bài viết.
resources/views/home.blade.php:
Tham số cho Route được truyền dưới dạng đối số thứ hai trong trợ giúp route(). Tham số có thể được truyền dưới dạng toàn bộ đối tượng hoặc truyền rõ ràng ID bằng cách sử dụng $post->id, đó là sở thích cá nhân của bạn.
Bây giờ, trên trang chủ, hình ảnh sẽ liên kết đến bài viết.
Bài trước: Second Model, GET Parameters và Eloquent
Bài tiếp: Login/Register Width Laravel Breeze
Cập nhật thêm được vài kiến thức mới
Bài viết hữu ích.
Hữu ích
Cảm ơn Admin. Bài viết khá hay !
OK bạn, mình sẽ sắp xếp viết một bài về Extend Validation. Cảm ơn bạn đã quan tâm nhé.