Form và Validation trong Laravel

Bảo Khanh

Well-known member
1. Form
Trước tiên, chúng ta cần tìm hiểu những cách thức để bảo mật form trong Laravel. Để bảo mật form trong Laravel, bạn có thể sử dụng một số cách như sau:
  • Sử dụng CSRF token: CSRF là viết tắt của Cross-Site Request Forgery, đây là một phương thức tấn công mà kẻ tấn công có thể giả mạo yêu cầu từ người dùng đến ứng dụng web. Laravel cung cấp CSRF token để giải quyết vấn đề này. Bạn có thể sử dụng directive @csrf để thêm CSRF token vào form của mình.
1680746665164.png


  • Sử dụng HTTPS: HTTPS là một giao thức an toàn và mã hóa dữ liệu trên mạng. Sử dụng HTTPS sẽ giúp ngăn chặn những kẻ tấn công giả mạo yêu cầu của người dùng.
  • Sử dụng validation: Laravel cung cấp các rule validation để kiểm tra dữ liệu được gửi đến từ người dùng. Bạn nên kiểm tra dữ liệu đầu vào của mình để đảm bảo rằng chúng không bị tấn công.
Trên đây là một số cách để bảo mật form trong Laravel. Tuy nhiên, đây chỉ là một phần của việc bảo mật ứng dụng web của bạn. Bạn nên tìm hiểu thêm về bảo mật web để đảm bảo rằng ứng dụng của bạn là an toàn và không bị tấn công.
2. Validation
Validation để làm gì?

Validation được sử dụng để kiểm tra tính hợp lệ của dữ liệu được nhập vào từ người dùng trước khi xử lí dữ liệu hoặc lưu vào cơ sở dữ liệu. Nó giúp đảm bảo rằng dữ liệu được nhập vào đáp ứng các yêu cầu và ràng buộc được xác định trước, giúp tránh được các lỗi dữ liệu không mong muốn và tăng tính bảo mật cho ứng dụng.
Dưới đây là một ví dụ đơn giản về validation trong một controller của Laravel:
1680746695185.png


Trong ví dụ này, chúng ta định nghĩa một hàm store() để xử lý request đăng ký người dùng. Đầu tiên, chúng ta sử dụng hàm Validator::make() để tạo một đối tượng validator và truyền vào dữ liệu đăng ký được gửi từ người dùng và các quy tắc validation.
  • Trong trường hợp này, chúng ta đang kiểm tra xem liệu trường "name" có bắt buộc nhập, không được quá 255 ký tự, trường "email" có đúng định dạng email, không được trùng lặp trong cơ sở dữ liệu, và không được quá 255 ký tự, và trường "password" có bắt buộc nhập, không được ngắn hơn 6 ký tự, và không được quá 255 ký tự.
  • Nếu validator phát hiện ra rằng dữ liệu không hợp lệ, nó sẽ trả về một đối tượng $validator với các thông báo lỗi cụ thể. Chúng ta sử dụng phương thức withErrors() để chuyển đối tượng validator này vào view đăng ký để người dùng có thể biết được lỗi của mình ở đâu và có thể sửa lại dữ liệu. Chúng ta cũng sử dụng phương thức withInput() để giữ lại các giá trị đã nhập của người dùng trên form.
  • Nếu dữ liệu hợp lệ, chúng ta lưu dữ liệu người dùng vào cơ sở dữ liệu và chuyển hướng người dùng đến trang đăng nhập.
Nhìn ở trên chúng ta thấy rằng có vẻ thằng Controller này đang phải đảm đương hơi nhiều công việc, với việc xử lý logic đơn giản chúng ta đã phải tốn kha khá dòng code rồi, nếu logic phức tạp với nhiều validate hơn thì code sẽ thực sự rối. Đây là lúc ta cần đến Form Request.
Tạo Form Request
Chúng ta có thể tạo FormRequest qua lệnh artisan:
1680746722609.png


Lệnh này sẽ tạo ra cho chúng ta file StoreBlogPostRequest ở App\Http\Requests. File này gồm 2 default method là authorize() và rules().
1680746739197.png


Trong ví dụ này, chúng ta đã tạo ra một Form Request StoreBlogPostRequest với hai trường title và body. Phương thức rules() xác định các quy tắc validation áp dụng cho các trường này.
Tuy nhiên, trong một số trường hợp, chúng ta có thể muốn thêm các rule hoặc kiểm tra dữ liệu bổ sung sau khi validate. Ví dụ, kiểm tra xem một email đã tồn tại trong database hay chưa, hoặc thêm một số điều kiện phức tạp để kiểm tra tính hợp lệ của dữ liệu.Để làm điều này, chúng ta có thể sử dụng phương thức withValidator(). Phương thức này nhận vào một tham số là đối tượng Validator và cho phép chúng ta thêm các rule hoặc kiểm tra dữ liệu bổ sung.
1680746767404.png


Ở đây, chúng ta đã sử dụng phương thức after() của validator để thêm một closure để kiểm tra email đã tồn tại trong database sau khi dữ liệu được validate. Nếu có lỗi, chúng ta sẽ thêm lỗi vào validator bằng phương thức add() của validator. Nếu không có lỗi, logic tiếp theo sẽ được thực thi trong Controller.
Sau đó, bạn có thể sử dụng Form Request trong Controller như sau:
1680746815387.png


Trong đoạn mã trên, chúng ta đã sử dụng Form Request StoreBlogPostRequest trong phương thức store() của Controller BlogController. Điều này sẽ giúp Laravel tự động thực hiện quy tắc validation và trả về các thông báo lỗi tương ứng nếu dữ liệu không hợp lệ. Nếu dữ liệu hợp lệ, chúng ta có thể tiếp tục xử lý dữ liệu trong phương thức store().
Để hiển thị thông báo lỗi validation, bạn có thể sử dụng phương thức messages() trong Form Request hoặc phương thức validate() trong controller. Nếu bạn sử dụng phương thức messages() trong Form Request, bạn có thể định nghĩa các thông báo lỗi tùy chỉnh cho mỗi quy tắc validation.
Ví dụ, để định nghĩa thông báo lỗi ở ví dụ trên, ta có thể sửa phương thức rules() như sau:
1680746841664.png


Trong ví dụ này, chúng ta đã tùy chỉnh lại các thông báo lỗi cho mỗi quy tắc validation. Ví dụ, nếu người dùng không nhập tiêu đề, Laravel sẽ trả về thông báo lỗi "Vui lòng nhập tiêu đề" thay vì "The title field is required." mặc định.
Cách để hiển thị lỗi ra view sau khi validation?
Để hiển thị các thông báo lỗi validation trong view, bạn có thể sử dụng biến $errors. Biến này là một instance của class Illuminate\Support\MessageBag và chứa các thông báo lỗi validation.
Trong view, bạn có thể sử dụng method has() để kiểm tra xem biến $errors có chứa thông báo lỗi hay không. Nếu có, bạn có thể sử dụng method first() để lấy ra thông báo lỗi đầu tiên. Ví dụ:
1680746859812.png


Ở đây, chúng ta sử dụng method has('title') để kiểm tra xem có thông báo lỗi cho trường title hay không. Nếu có, chúng ta hiển thị thông báo lỗi đầu tiên cho trường này bằng cách sử dụng method first('title').

CÔNG TY TNHH TƯ VẤN TRUYỀN THÔNG MINARA
ĐỊA CHỈ:
- 182 Trần Bình Trọng, P.3, Q.5, Tp.HCM
- 27 Đường số 16, Trung Tâm Hành Chính Dĩ An, Bình Dương.
Điện thoại: 097.777.1060
Email: info@minara.vn
Website: www.minara.vn
 
Bên trên