Laravel 07: Route parameters và Controllers

Route param

Trong các bài học trước, chúng ta đã tìm hiểu về query params. Tuy nhiên, như các bạn đều biết, đôi lúc tham số của chúng ta được định hẳn thành một route, tức là thay vì /posts?id=123, chúng ta sẽ có URL dạng /posts/123. Và Laravel, không có gì khác lạ, cung cấp cho chúng ta giải pháp cho vấn đề này. Cụ thể, nếu param là một route query, chúng ta có hàm dưới đây:

Đối với route param, vì đó là một route hẳn hoi, nên chúng ta không thể dùng hướng bên trên để giải quyết, và $id cũng không được “tách chiết” từ request được, vì chúng ta không param map. Thay vào đó, $id nằm trực tiếp trong closure định nghĩa response. Tức là:

Controllers

Giả sử, chúng ta có những định nghĩa route sau đây:

Việc phải xử lí tất cả trong web.php tuy có lợi ích là “tất cả trứng đều nằm chung giỏ”, tuy nhiên, nếu số lượng routes tăng lên nhiều thì lợi bất cập hại, dễ khiến bạn nổi điên. Và sau một đêm mất ngủ, khi bật máy tính, bạn sẽ tức quá hóa rồ hệt như trong bức ảnh bên dưới:

Thay vì uống thuốc giảm đau, bạn có thể sử dụng Controller để chia nhỏ vấn đề ra để dễ bề thao tác. Nhưng chia như thế nào là hợp lí? Câu trả lời được nhiều người đồng tình nhất là bạn gom chung các routes giống nhau về cùng một Controller. Trong ví dụ của chúng ta, tôi sẽ có đúng 3 Controller là PostController, CategoryController và AuthorController. Dù chúng ta có thể tự tạo các file controller.php bằng tay, nhưng để dễ dàng và chính xác hơn, mọi người đều dùng command có sẵn. Và với ví dụ đã cho, tôi chạy 3 commands tương ứng với 3 controllers:

Khi tạo các controllers với commands trên, chúng sẽ được nằm tại app/Http/Controllers. Bây giờ, chúng ta mở PostController:

Bây giờ, tôi định nghĩa thêm hai functions trong PostController như bên dưới. Thực chất, chúng chỉ là wrapper cho hai closures của ‘/posts’ routes:

Như vậy, chúng ta đã đưa nội dung của hai closures vào PostController. Bước cuối cùng, ta chỉ việc reference PostController@index và PostController@show vào web.php:

Lưu ý, các tham số thứ hai của chúng ta hiện tại là String chứ không còn là closure nữa. Và như vậy là xong. Sau này, khi bạn muốn thay đổi nội dung về ‘/posts’ routes, bạn chỉ cần thay đổi nội bộ tập tin PostController mà thôi. Vừa dễ tìm lại vừa dễ chỉnh sửa hơn là tập trung lại một nơi tại web.php. Cuối cùng, nhiệm vụ của các bạn là làm tương tự với CategoryController và AuthorController. Chúc các bạn thành công và hãy đừng xóa project. Các bài viết sau sẽ tiếp nối với những gì đã được trình bày trong bài này.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.