Laravel: Làm thế nào để cấu trúc routes trong các dự án lớn?
https://viblo.asia/p/laravel-lam-the-nao-de-cau-truc-routes-trong-cac-du-an-lon-924lJLVzKPM
Last updated
https://viblo.asia/p/laravel-lam-the-nao-de-cau-truc-routes-trong-cac-du-an-lon-924lJLVzKPM
Last updated
Bài đăng này đã không được cập nhật trong 3 năm
Hãy tưởng tượng một dự án Laravel với hơn 100+ routes, chia ra các phần riêng biệt dành cho khách, người dùng, quản trị viên, .... Bạn có thực sự muốn giữ tất cả trong một file không? Làm thế nào bạn có thể nhóm chúng, thêm tiền tố vào các URL? Hãy cùng xem những cách chúng ta có.
Việc này là dễ dàng, vì trong default của Laravel chúng ta có 2 files:
Vì vậy, nếu dự án của bạn có cả trang web-pages và API (ngày càng phổ biến hơn), vui lòng đặt các API routes trong file riêng biệt đó.
Ví dụ: nếu bạn có /users
page và sau đó /api/users/
endpoint, việc tách chúng ra các file riêng giúp chúng ta không bị nhầm lẫn giữa cùng name trong cùng file.
Điều đó có nghĩa rằng, gần đây tôi đã thấy ví dụ phản trực quan từ offical
Laravel project. Với Laravel Horizon, Taylor chỉ có các API routes và anh ấy đã không sử dụng file riêng biệt, thay vào đó anh ấy đưa nó vào routes/web.php
:
Một bằng chứng khác cho thấy cấu trúc trong Laravel rất cá nhân và không có tiêu chuẩn nào là 100%, ngay cả từ chính Taylor.
Điều đó cũng xuất phát từ "basic" Laravel - route. Đây là một ví dụ từ official Laravel documentation:
Cách sử dụng cơ bản nhất là ẩn các groups khác nhau dưới các middleware khác nhau. Ví dụ: bạn muốn một group bị hạn chế bởi middleware auth
mặc định, một group khác bằng custom middlware admin
, ...
Cùng với đó, bạn cũng có thể sử dụng Route group name
và prefix
. Một vài ví dụ khác từ offical documentation:
Tương tự, nếu bạn muốn thêm tất cả các middleware+name+prefix vào 1 group, nó sẽ dễ đọc hơn nếu bạn nhét chúng vào một array:
Hãy liên kết tất cả lại với nhau thành một ví dụ thực tế với 3 groups:
“Guest” group with /front/XXXXX URLs and no middleware;
“User” group with /user/XXXXX URLs and auth middleware;
“Admin” group with /admin/XXXXX URLs and custom admin middleware.
Đây là cách để nhóm chúng vào trong routes/web.php
file:
Trong ví dụ trên, chúng ta đã không sử dụng Controllers, chúng ta chỉ trả lại static text như một ví dụ. Hãy thêm Controller, với thêm một "twist" - chúng ta sẽ cấu trúc chúng vào các thư mục với các namespaces khác nhau của chúng, như thế này:
Và sau đó chúng ta có thể sử dụng chúng trong Routes file:
Nhưng nếu chúng ta có nhiều Controllers trong group đó thì sao? Chúng ta có nên tiếp tục thêm Front\SomeController
mọi lúc không? Tất nhiên là không. Bạn cũng có thể chỉ định namespace là một trong các tham số.
Tình huống trên, với ba groups, được đơn giản hóa, các dự án thực tế có cấu trúc hơi khác nhau - gồm hai group: front
và auth
. Và sau đó bên trong auth
có các sub-group: user
và admin
. Vì vậy, chúng ta có thể tạo các sub-group trong routes/web.php
và gán các middleware/prefix khác nhau, ...
Chúng ta có thể làm điều đó ngay cả với hơn hai cấp độ, đây là một ví dụ từ dự án open source Akaunting:
Một ví dụ khác từ Laravel CRM phổ biến khác Monica:
Có 1 file phục vụ cho tất cả các routes setting - app/Providers/RouteServiceProvider.php
. Nó có method map()
nơi mà bind cả 2 files routes - web
và api
.
Bạn có nhận thấy middleware, namespace và prefix được đề cập trong các method không? Đó là nơi bạn có thể thiết lập các setting chung cho toàn bộ file, do đó, bạn sẽ phải lặp lại chúng cho mỗi Route group trong file.
Nó chủ yếu được sử dụng cho các API routes, vì các cài đặt của chúng thường giống nhau, như sau:
Method này sẽ prefix tất cả API URLs vơi api/v1/
khi bắt đầu.
Nếu bạn có số lượng routes lớn và muốn group chúng nhiều hơn, vào các file riêng biệt, thì bạn có thể sử dụng cùng một file được đề cập trong phần trước - app/Providers/RouteServiceProvider.php
. Nếu bạn xem xét kỹ hơn các phương thức map()
của nó, bạn sẽ thấy commented out ở cuối:
Bạn có thể diễn giải nó như một "invitation" để thêm nhiều files hơn, nếu bạn muốn. Vì vậy, bạn có thể tạo một phương thức khác như mapAdminRoutes()
bên trong file này, sau đó thêm nó vào phương thức map()
và file riêng biệt của bạn sẽ được đăng ký và load tự động.
Nhưng, cá nhân tôi, tôi không thấy nhiều lợi ích trong cách tiếp cận này và tôi không thấy nó được thực hiện thường xuyên. Nó mang lại một chút riêng biệt trong routes, nhưng đôi khi bạn bị lạc trong các file đó và không chắc chắn nơi để tìm thấy các route cụ thể.
Nói về các routes lớn hơn và bị lạc ở đó, chúng ta có một aritsan command giúp xác định vị trí một route nhất định.
Có lẽ tất cả các bạn đều biết rằng php artisan route:list
sẽ cung cấp cho bạn tất cả các routes trong dự án:Nhưng bạn đã biết cách filter để tìm chính xác điều bạn muốn? Hãy thêm parameters -method
, hoặc -name
hoặc -path
:
Filter by method - GET
, POST
:Filter by name hoặc URL part:
Nguồn: https://laraveldaily.com/how-to-structure-routes-in-large-laravel-projects/
All rights reserved