Tạo đường dẫn cho blog Laravel
Xin chào mọi người, em là newbie vừa đến với Laravel. Em có theo hướng dẫn trên mạng và làm được một trang blog xây dựng bằng laravel.
Trang của em có 1 cơ sở dữ liệu chứa hai bảng là POST và CATEGORY trong POST có cột category_id chứ id danh mục của bài viết, trong CATEGORY có cột slug là cái mà em cần lấy và bỏ vào route để đường dẫn của em có dạng http://localhost/post/{category-slug}/{post-slug}/
ạ.
Em đã dùng relationship để hiển thị được category_slug thông qua id ở trang index rồi ạ. Nhưng chưa tìm được cách để kết nối nói với lại view trong ROUTE.
Đây là Model Post của em Đây là Model Categories của em và đây là route của em ạ
Không biết có anh/chị hoặc cao nhân nào có kinh nghiệm code Laravel lâu năm có thể hỗ trợ giúp em vấn đề này được không ạ?. Em xin cảm ơn, và mong mọi người thứ lỗi nếu có làm phiền ạ!.
1 CÂU TRẢ LỜI
Anh vẫn chưa hiểu câu hỏi của em lắm, em đang gặp vấn đề với việc hiển thị nội dung bài viết theo đường dẫn http://localhost/post/{category-slug}/{post-slug}/
à
Nếu vậy thì là do đoạn định nghĩa Route::get('/post/category_slug/post_slug', function() {})
của em đang có vấn đề rồi. Nếu cần đưa category_slug
hay post_slug
vào URL dưới dạng parameter, thì em cần đặt chúng vào trong dấu { }
, tức em cần định nghĩa route như sau:
Route::get('/post/{category_slug}/{post_slug}', function($categorySlug, $postSlug) {
// Xử lý ở đây
// Bước 1: Tìm $post theo $post_slug
// Bước 2: Từ $post, tìm ra $category, và so sánh với $category_slug
// Nếu $post->category->slug khác với $category_slug trên URL thì có 2 cách xử lý, 1 là trả ra lỗi, 2 là redirect sang đường dẫn với category_slug chính xác
// Nếu $post->category->slug bằng với $category_slug, thì tiếp tục xử lý logic hiển thị
});
Cảm ơn anh đã dành thời gian hỗ trợ câu hỏi của em, em hiện là newbie mới đến với laravel, nên chưa có rành lắm. Cảm phiền anh có thể hướng dẫn kĩ hơn giúp em được không ạ?.
@le.kienhoanh Không sao em, ai cũng có những lúc bắt đầu tìm hiểu cái này, tìm hiểu cái kia và cũng sẽ gặp những khó khăn nhất định. Chịu khó tự học, không biết thì hỏi, đó là việc tốt mà Cụ thể em còn chỗ nào chưa hiểu rõ và cần hướng dẫn thêm nhỉ
Anh thấy ở trong file route, ở đoạn dưới phần comment // new single page view
, em sửa dòng Route::get('/post/category_slug/post_slug', function() {
thành Route::get('/post/{category_slug}/{post_slug}', function($categorySlug, $postSlug) {
là được mà nhỉ
@thangtd90 Hi anh, xin lỗi vì đã trả lời muộn, nhưng rồi làm sao mình có thể truyền tham số vào hai cái biến này để nó nhận được category nào và bài viết nào ạ?. Cảm ơn anh đã giành thời gian ạ!.
@le.kienhoanh à các parameters này sẽ được truyền vào hàm callback ở đằng sau theo thứ tự, nên em chỉ cần định nghĩa biến $categorySlug
với $postSlug
ở phần callback, sau đó tiến hành xử lý thôi.
Ví dụ như với định nghĩa Route::get('/post/{category_slug}/{post_slug}', function($categorySlug, $postSlug) { });
thì khi em truy cập vào URL dạng http://localhost/post/laravel/a-post-example-with-laravel-category/
thì $categorySlug
sẽ tự động được gán giá trị laravel
, còn $postSlug
sẽ tự động được gán giá trị a-post-example-with-laravel-category
rồi.
Không rõ đó có phải điều em cần hỏi không nhỉ
@thangtd90 cảm ơn anh đã phản hồi, nhưng nếu dữ liệu category_slug của em nằm tại bảng categories và post_slug của em nằm ở bảng posts và trong bảng posts này lại có cột category_id thì em làm cách nào để đổ dữ liệu ra ạ?.
@le.kienhoanh Anh không hiểu ý em lắm, đổ dữ liệu ra tức là sao nhỉ? Em muốn lấy ra $post
và $category
tương ứng à, hay sau khi lấy được rồi em muốn truyền xuống view
Mà ở dưới phần comment // single view post
anh thấy em có xử lý được hết, trong trường hợp với route là Route::get('/post/{slug}', function($slug) {
rồi mà nhỉ, khi thêm category_slug
vào thì nhìn chung cũng không có gì khác nhiều lắm mà
Ví dụ như em có thể xử lý theo flow như thế này, em xem qua xem có vấn đề gì không
Route::get('/post/{category_slug}/{post_slug}', function($categorySlug, $postSlug) {
// Bước 1: Tìm $post theo $post_slug
$post = App\Post::where('slug', $postSlug)->firstOrFail();
// Bước 2: Từ $post, tìm ra $category, và so sánh với $categorySlug
// Nếu $post->category->slug khác với $categorySlug trên URL thì có 2 cách xử lý,
// 1 là trả ra lỗi, 2 là redirect sang đường dẫn với category_slug chính xác
// Dưới đây là xử lý theo cách 2, redirect về URL đúng
if ($post->category->slug != $categorySlug) {
return redirect("post/{$post->category->slug}/{$post->slug}");
}
// Nếu $post->category->slug bằng với $category_slug, thì tiếp tục xử lý logic hiển thị view
return view('post.viewpost', compact('post'));
});
wow, cảm ơn anh đã phản hồi, em sẽ thử xem sao. haha. Cảm ơn anh nhiều ạ!
@thangtd90 Em chào anh, em có thử dùng cách của anh bỏ vào code rồi, nhưng em nhận được lỗi page not found, vậy hình như là nó không có trả về được cái view cho mình đúng không ạ?. Đây là web.php của em sau khi đã thực hiện theo hướng dẫn của anh ạ!.
@le.kienhoanh Em đang truy cập vào URL như thế nào mà nhận được lỗi đó vậy?
Ngoài ra, em thử debug bằng cách thêm dòng dd('here')
vào ngay phía trước dòng $post = App\Post::where('slug', $postSlug)->firstOrFail();
xem sao? Để check xem là nó đã chạy vào bên trong hàm callback chưa.
@thangtd90 Cảm ơn anh đã dành thời gian ạ. Em có một trang hiện đang chạy live trên hosting có link là http://blog.kiemtrasite.work . Nếu anh lên trang đó thì em nghĩ là anh sẽ có cái nhìn khái quát hơn về các đường link trên bài đăng ạ.
Em sửa code lại như này có đúng chưa ạ?
@thangtd90 à há, em nghĩ là em đã làm được rồi, hahahah :3
Em cảm ơn anh nhiều nhiều nhiều lắm ạ!.
@le.kienhoanh Chúc mừng em
Có vấn đề gì thì cứ hỏi ở trên này nhé
@thangtd90 dạ, em cảm ơn anh nhiều ạ. chúc anh có 1 tuần làm việc đầy thuận lợi và vui vẻ ạ!.