Hướng dẫn php routing with parameters
Chào mừng các bạn đã quay trở lại với series "Hành trình chinh phục Laravel framework". Cuối cùng sau những tập căng não thì chúng ta đã hoàn thành xong các khái niệm kiến trúc của Laravel. Bắt đầu từ tập này, chúng ta sẽ đi tìm hiểu lần lượt các component từ cơ bản đến nâng cao. Trong tập mở màn này, chúng ta sẽ tìm hiểu về "Routing". Show
I. Giới thiệu (Introduction)Mình đã có đề cập về routing rồi, chính vì vậy ở phần này mình sẽ tóm gọn lại nội dung chính về nó thôi. Routing hiểu đơn giản là nơi nhận request gửi từ client và tìm route nào có cơ sở đặc trưng giống với request để xử lý. Ví dụ client gửi một request với phương thức
Nhiệm vụ của routing là sẽ tìm các route đã khai báo ở trên và so sánh với request hiện tại các yếu tố như url, method... để tìm
ra route cùng bản chất với request, sau đó tiến hành thực hiện controller/action được khai báo trong route đó. Như ví dụ trên, Để hiểu rõ hơn, ta hãy bắt đầu tìm hiểu cách sử dụng routing ở bên dưới. II. Routing cơ bản (Basic routing)Chắc hẳn các bạn đã biết, để làm việc với routing ta sẽ tương tác các file trong thư mục 1. Simple routeMột cú pháp routing cơ bản Laravel chấp nhận một URI và Closure object:
Để có thể truy cập route trên, từ trình duyệt ta gõ đường dẫn http://locahost:8000/foo. Ta sẽ nhận được kết quả như bên dưới: Nếu request mà không thỏa mãn route nào thì Laravel sẽ trả về trang lỗi 404. 2. Một số phương thức route (Some route methods)Router cho phép bạn đăng ký một route với bất kì phương thức HTTP nào.
Về mức độ an toàn, nói một các dễ nhớ là các phương thức HTTP nào không làm thay đổi bất kì điều gì liên quan tới server thì được coi là an toàn và ngược lại.
Trong
trường hợp hợp một request có thể truy cập theo nhiều phương thức HTTP khác nhau thì Laravel cung cấp cho chúng ta method
Hoặc nếu request có thể thực thi thông qua bất kì phương thức HTTP nào, ta có thể sử dụng method
Chẳng hạn mình có một route
Mình dùng Postman để gửi request đến route này, và đây là kết quả nhận được: Chắc chắn rồi, vì đây là một phương thức HTTP không an toàn nên Laravel trả về lỗi 419 với trang có title là "Page Expired". Vậy cách làm thế nào để gửi request với các phương thức HTTP được bảo mật bởi CSRF token thì chúng ta sẽ tìm hiểu ở những tập sau, mình chỉ tản mạn tới đây thôi. Các bạn có thể tự kiếm chứng các method trên vào những tập sau nhé! 3. Route chuyển hướng (Redirect route)Nếu
bạn muốn định nghĩa một route chuyển hướng đến URI khác, bạn có thể sử dụng phương thức
Bạn có thể nạp server và kiểm chứng kết quả. Mặc định,
Nếu bạn không thích thêm quá nhiều tham số như cách trên, bạn có thể sử dụng
Nói tới mã chuyển hướng 301 và 302 mình xin tản mạn một chút về vấn đề này. Khi nào chúng ta redirect với 301, khi nào redirect với 302?
4. View routeNếu route bạn khai báo chỉ nhằm mục đích trả về
Ở đây mình đã sử dụng một file view có
sẵn trong source, đó là Để ví dụ cho tham số thứ ba trong method
Mình đã truyền một mảng dữ liệu vào file view Mặc định:
Sửa lại:
Lúc
này, key Và đây là kết quả: III. Tham số route (Route parameter)URI thì có thể chứa cả tham số, nhưng chẳng lẽ ta phải khai báo từng giá trị mặc định trong routing? Không, Laravel cung cấp cú pháp giúp ta có thể định nghĩa một route chứa tham số. 1. Required parametersChẳng
hạn bạn có một URI
Bạn có thể thêm nhiều tham số trong cùng một URI.
Quan sát đoạn code trên ta có thể thấy Từ đó ra rút ra thê một số đặc điểm:
2. Optional paramtersGiả sử khách hàng yêu cầu bạn thiết lập tùy chọn cho đường dẫn
Bạn có nhận thấy có dấu
Lấy một ví dụ nữa, chẳng hạn mình có đường dẫn
Bây giờ chúng ta thử đi kiểm chứng đoạn code sau:
Các bạn nạp server và chạy thử đường dẫn http://localhost:8000/post/comment/1 thử xem, chắc chắn sẽ báo lỗi 404. Tại sao vậy? Nếu không truyền id cho post thì nó sẽ tự nhận là 1 mà, vậy sao lại lỗi? Vâng, Laravel không thần thánh tới mức ấy, chính vì vậy khi khai báo một optional parameter nào đó thì phải thuân theo 2 điều liện:
3. Regular expression constraintChắc hẳn khi học PHP các bạn đã quá quen thuộc với thuật ngữ này rồi. Khi áp dụng với route thì Laravel sẽ ràng buộc các tham số theo những pattern mà chúng ta khai báo với cú pháp rất ngắn gọn, dễ hiểu bằng method Chẳng hạn đối với tham số
Ta có thể thấy tham
số thứ nhất mà Bạn cũng có thể ràng buộc nhiều tham số khác nhau trong cùng một route, chẳng hạn:
Lúc này Thử nghĩ trong một ứng dụng có rất nhiều tham số Việc global constraint này sẽ được thực hiện tại file
Lúc này, mọi tham số 4. Mã hóa '/' (Encoded forward Slashes)Giả sử mình khai báo một route để tìm kiếm như sau:
Một bài viết có tiêu đề là "About controller/closure object", giờ mình muốn tìm kiếm bài viết này thông qua route trên thì phải vào đường dẫn http://localhost:8000/search/About controller/closure object nhưng lại báo lỗi 404, một kết quả mình không mong muốn chút nào. Lý do xảy ra lỗi trên chính là vì giá trị tham số
Đây chính là kết quả mà mình mong muốn:
IV. Đặt tên route (Set name for route)Thay vì nhớ các URI của từng route thì bạn có thể đặt tên cho nó để dễ dàng tương tác bằng phương thức
Với việc đặt tên sẽ dễ dàng lấy url từ route:
hay cũng như chuyển hướng đến route đó:
Nếu route được đặt tên có chứa tham số, ta có thể dễ dàng truyền giá trị cho tham số bằng cách:
V. Nhóm route (Route group)Các route nằm trong cùng một nhóm sẽ được chia sẻ các thuộc tính route như namespace, middleware, tiền tố tên, tiền tố URI,... 1. Middleware routeĐể gán middleware cho các route chung một nhóm, bạn có thể sử dụng phương thức
2. Namespace routeVới method
(Mọi controller được gọi trong nhóm này sẽ được thêm namespace
3. Sub-domain routeLaravel còn cung cấp cho chúng ta nhóm sub-domain. Nhóm này có thể chỉ định tham số như một URI, cho phép ta có thể giữ một phần sub-domain để sử dụng trong các route con. Để khai báo nhóm sub-domain, bạn sử dụng method
Tham số
4. Tiền tố URI route (Route prefix)Giả sử ứng dụng của bạn có admin cpanel để quản lý nội
dung, nhưng có rất nhiều route có URI chứa
Dấu 5. Tiền tố tên route (Route named prefix)Cũng như route prefix, route named prefix sẽ thêm tiền tố tên chung cho mỗi route con nằm trong nhóm.
Bạn có thể thay thế ký tự ngăn cách Nếu như
có một nhóm route có cùng chung namespace, prefix, name chẳng hạn thì ta có thể gom các thuộc tính này vào
VI. Route model bindingKhi bạn inject một model instance theo ID nào đó vào route hoặc controller action, thông thường ta sẽ phải truy vấn đến model theo ID đã cho. Nhưng Laravel
route model binding cung cấp cho chúng ta một cú pháp thoải mái để có thể tự động inject các model object trong route. Tức là thay vì chỉ inject ID của 1. Binding ngầm (Implicit binding)Laravel sẽ tự động resolve model được định nghĩa trong route hoặc controller action bằng cách type-hint và khai báo biến có tên trùng với tên tham số.
Đoạn code trên có nghĩa là khi
chúng ta truy cập đường dẫn http://localhost:8000/api/user/1 chẳng hạn thì một model object sẽ được khởi tạo với ID bằng 1 từ database, sau đó inject vào route và trả về Vì chúng ta chưa tìm hiểu đến "Model Laravel" nên không thể test cho các bạn xem được. Các bạn có thể tự kiểm chứng sau khi tới tập đó nhé! Mặc định thì route model binding
sẽ dùng ID để truy vấn vào database. Bạn có thể thay đổi thiết lập này bằng cách khai báo method
2. Binding rõ ràng (Explitcit binding)Nếu bạn muốn code trở nên rõ ràng, có thể sử dụng explitcit binding trong
Trong đó:
Sau đó inject bình thương như implitcit binding:
Nếu bạn muốn sử dụng cách xử lý logic riêng, bạn có thể sử dụng phương thức
Ở dòng Hình thức này áp dụng khi bạn muốn thay vì báo lỗi 404 thì thay thế/thêm một hành động nào đó thông qua sử dụng tùy chỉnh logic riêng này. Ngoài ra nếu bạn không muốn code quá nhiều trong
VII. Route dự phòng (Fallback route)Với fallback route này, bạn có thể thực hiện một xử lý nào đó khi không có bất kì route nào thỏa mãn với request, thường thì sử dụng để báo lỗi 404 và xử lý thêm vài công việc nào đó.
VIII. Giới hạn truy cập (Rate limit)Thông thường ta hay ứng dụng giới hạn truy cập cho REST API, hoặc ngăn chặn tấn công DDoS. Laravel cung cấp cho chúng ta một middleware có thể làm được việc này, đó là
Chẳng hạn giờ các bạn muốn client chỉ truy xuất được dữ liệu từ API chỉ 5 lần trong 1 phút thì bạn có thể định nghĩa route như sau:
Trong đó: Giờ các bạn thử truy cập http://localhost:8000/api/user và refresh quá 5 lần xem, một trang lỗi 429 sẽ được trả về. Các bạn thử đợi trong 1 phút, ta có thể truy cập lại được đấy. Bạn có thể thay thế số lần truy cập giới hạn bằng một tham số khi model
Ứng dụng của trường hợp này nếu bạn đang xây dựng trang API có phí, tức là tài khoản dùng thử sẽ giới hạn 10/1 phút và tài khoản có trả phí được 100/1 phút chẳng hạn. Do hiện giờ ta chưa học "Middleware" và "Authentication" nên không thể test được vì yêu cầu phải thực hiện login user. Các bạn có thể tự kiểm chứng vấn đề này trong những tập sau. IX. Truy cập route hiện tạiBạn có thể lấy một số thông tin về route hiện hiện từ các phương thức trong facade
Bạn có thể tham khảo một số API trong Route facade và Route instance. Cảm ơn các bạn đã quan tâm theo dõi. Cùng đồng hành với mình qua những tập tiếp theo tại series "Hành trình chinh phục Laravel Framework" nhé! Chúc may mắn và hẹn gặp lại.
|