Yêu cầu thg 9 14, 2018 10:32 SA 901 1 1
  • 901 1 1
+1

Tạo đường dẫn cho blog Laravel

Chia sẻ
  • 901 1 1

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à POSTCATEGORY 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


Đã trả lời thg 9 14, 2018 10:57 SA
Đã được chấp nhận
+2

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ị
});
Chia sẻ
Avatar KienHoanh Le @le.kienhoanh
thg 9 14, 2018 11:03 SA

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 ạ?.

Avatar Tran Duc Thang @thangtd90
thg 9 14, 2018 11:13 SA

@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ỉ 🤔

Avatar KienHoanh Le @le.kienhoanh
thg 9 15, 2018 6:32 SA

@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 ạ!.

Avatar Tran Duc Thang @thangtd90
thg 9 15, 2018 8:38 SA

@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ỉ 🤔

Avatar KienHoanh Le @le.kienhoanh
thg 9 15, 2018 10:17 SA

@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 ạ?.

Avatar Tran Duc Thang @thangtd90
thg 9 15, 2018 11:33 SA

@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$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'));
});
Avatar KienHoanh Le @le.kienhoanh
thg 9 15, 2018 3:30 CH

wow, cảm ơn anh đã phản hồi, em sẽ thử xem sao. haha. Cảm ơn anh nhiều ạ!

Avatar KienHoanh Le @le.kienhoanh
thg 9 17, 2018 2:30 SA

@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 ạ!.

route.png

Avatar Tran Duc Thang @thangtd90
thg 9 17, 2018 2:41 SA

@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.

Avatar KienHoanh Le @le.kienhoanh
thg 9 17, 2018 2:44 SA

@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 ạ.

route.png

Em sửa code lại như này có đúng chưa ạ?

Avatar KienHoanh Le @le.kienhoanh
thg 9 17, 2018 2:48 SA

@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 ạ!. 🤝

Avatar Tran Duc Thang @thangtd90
thg 9 17, 2018 2:53 SA

@le.kienhoanh 🤝 Chúc mừng em 😄

Có vấn đề gì thì cứ hỏi ở trên này nhé 😉

Avatar KienHoanh Le @le.kienhoanh
thg 9 17, 2018 2:54 SA

@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ẻ ạ!. 🤝

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí