Nội dung chính
- Laravel Validation là gì?
- Các quy tắc Laravel Validation
- Hướng dẫn cách tạo quy tắc Laravel validation
- Cách áp dụng các quy tắc Laravel Validation
- Cách áp dụng Laravel Validation để xác thực mảng (Array)
- Cách áp dụng Laravel Validation để kiểm duyệt file
- Cách áp dụng Laravel Validation để xác thực mật khẩu
- Câu hỏi thường gặp về Laravel Validation
- Tổng kết Laravel Validation
Trong phát triển ứng dụng hiện đại, việc đảm bảo dữ liệu đầu vào là hợp lệ và chính xác là vấn đề quan trọng hàng đầu. Laravel – một framework PHP phổ biến, cung cấp nhiều phương thức validation (kiểm tra dữ liệu đầu vào) mạnh mẽ và toàn diện. Bài viết này sẽ hướng dẫn bạn cách tạo và áp dụng hiệu quả Laravel validation, từ sử dụng các quy tắc xác thực có sẵn đến việc tạo ra các quy tắc tùy chỉnh, giúp bảo vệ ứng dụng của bạn khỏi các dữ liệu không mong muốn và đảm bảo tính toàn vẹn của hệ thống.
Đọc bài viết để nắm rõ:
- Laravel validation là gì?
- Tất cả các loại quy tắc Laravel validation và chức năng của chúng
- Các cách tạo và áp dụng Laravel validation phổ biến nhất
Laravel Validation là gì?
Laravel validation là việc xác thực hoặc kiểm tra dữ liệu trong framework Laravel. Việc này giúp đảm bảo dữ liệu hợp lệ, chính xác, đáp ứng mọi yêu cầu của hệ thống, đồng thời giúp duy trì tính nhất quán của dữ liệu và tránh các lỗ hổng bảo mật.
Laravel là công cụ giúp cho việc xác thực dữ liệu trở nên dễ dàng và trực quan vì nó tuân theo kiến trúc model-view-controller (MVC) và cung cấp nhiều phương thức để kiểm tra dữ liệu đầu vào toàn diện. Mỗi phương thức validation trong Laravel đều có ưu và nhược điểm riêng, sự đa dạng này cho phép bạn lựa chọn cách tiếp cận tốt nhất cho nhu cầu của mình.
Đọc thêm: Laravel là gì? Tổng quan về Laravel A-Z cho người mới bắt đầu
Các quy tắc Laravel Validation
Dưới đây là danh sách tất cả các quy tắc xác thực có sẵn trong Laravel và chức năng của chúng:
Quy tắc Laravel Validation | Giải thích chức năng |
accepted |
Trường đang được xác thực phải là “yes”, “on”, 1, “1”, true, hoặc “true”. Quy tắc này hữu ích cho việc xác thực việc người dùng chấp nhận “Điều khoản dịch vụ/ Terms of Service” hoặc các trường tương tự. |
accepted_if |
Chức năng của accepted_if giống với accepted chỉ có điểm khác là chúng chỉ kiểm tra giá trị của trường nếu một trường khác có giá trị cụ thể. |
active_url |
Trường đang được xác thực phải có bản ghi A hoặc AAAA hợp lệ theo hàm dns_get_record của PHP. Tên miền của URL được cung cấp sẽ được trích xuất bằng hàm parse_url của PHP trước khi được truyền vào dns_get_record. Quy tắc active_url chỉ kiểm tra xem URL có bản ghi DNS hợp lệ hay không, không đảm bảo rằng URL dẫn đến một trang web hoạt động. |
after (date) |
Trường đang được xác thực phải là một giá trị sau một ngày tham chiếu. Các ngày sẽ được truyền vào hàm strtotime của PHP để được chuyển đổi thành một đối tượng DateTime hợp lệ: ‘start_date’ => ‘required|date|after:tomorrow’ Thay vì truyền vào một chuỗi ngày để được đánh giá bởi strtotime, bạn có thể chỉ định một trường khác để so sánh với ngày: ‘finish_date’ => ‘required|date|after:start_date’ Quy tắc after chỉ kiểm tra thứ tự thời gian của các ngày, không đảm bảo rằng các ngày có hợp lý hay không. Ví dụ: after:2024-01-01 sẽ hợp lệ cho cả 2024-02-01 và 2023-12-31. |
after_or_equal (date) |
Quy tắc này gần giống với quy tắc after, chỉ khác là trường đang được xác thực phải là một giá trị sau hoặc bằng với ngày tham chiếu. Quy tắc after_or_equal chỉ kiểm tra thứ tự thời gian của các ngày, không đảm bảo rằng các ngày có hợp lý hay không. Ví dụ: after_or_equal:2024-01-01 sẽ hợp lệ cho cả 2024-02-01, 2024-01-01, và 2023-12-31. |
alpha | Trường đang được xác thực phải hoàn toàn là các ký tự bảng chữ cái Unicode có trong \p{L} và \p{M}.
Để giới hạn quy tắc xác thực này chỉ trong phạm vi ký tự ASCII (a-z và A-Z), bạn có thể cung cấp tùy chọn ascii cho quy tắc xác thực: ‘username’ => ‘alpha:ascii’, |
alpha_dash |
Trường đang được xác thực phải hoàn toàn là các ký tự chữ và số Unicode chứa trong \p{L}, \p{M}, \p{N}, cũng như dấu gạch ngang ASCII (-) và dấu gạch dưới ASCII (_). Để giới hạn quy tắc xác thực này chỉ trong phạm vi ký tự ASCII (a-z và A-Z), bạn có thể cung cấp tùy chọn ascii cho quy tắc xác thực: ‘username’ => ‘alpha_dash:ascii’, |
alpha_num |
Trường đang được xác thực phải hoàn toàn là các ký tự chữ và số Unicode chứa trong \p{L}, \p{M}, \p{N}. Để giới hạn quy tắc xác thực này chỉ trong phạm vi ký tự ASCII (a-z và A-Z), bạn có thể cung cấp tùy chọn ascii cho quy tắc xác thực: ‘username’ => ‘alpha_num:ascii’, |
array |
Trường đang được xác thực phải là một mảng PHP. Khi bạn cung cấp thêm giá trị cho quy tắc array, mỗi khóa trong mảng đầu vào phải có mặt trong danh sách giá trị được cung cấp cho quy tắc. Trong ví dụ sau, khóa admin trong mảng đầu vào không hợp lệ vì nó không có trong danh sách các giá trị được cung cấp cho quy tắc array: use Illuminate\Support\Facades\Validator; $input = [ ‘user’ => [ ‘name’ => ‘Taylor Otwell’, ‘username’ => ‘taylorotwell’, ‘admin’ => true, ], ]; Validator::make($input, [ ‘user’ => ‘array:name,username’, ]); Trong mọi trường hợp, bạn nên chỉ định các khóa mảng được phép có mặt trong mảng của bạn. |
ascii |
Trường đang được xác thực phải hoàn toàn là các ký tự ASCII 7-bit. |
bail |
Dừng việc chạy các quy tắc xác thực cho trường sau khi gặp lỗi xác thực đầu tiên.
Lưu ý: Quy tắc bail chỉ dừng việc xác thực cho một trường cụ thể khi gặp lỗi xác thực, còn phương thức stopOnFirstFailure sẽ thông báo cho validator rằng nó nên dừng việc xác thực tất cả các thuộc tính khi gặp lỗi xác thực đầu tiên: if ($validator->stopOnFirstFailure()->fails()) { // … } |
Before (date) |
Trường đang được xác thực phải là một giá trị trước ngày tham chiếu. Các ngày sẽ được truyền vào hàm strtotime của PHP để được chuyển đổi thành một đối tượng DateTime hợp lệ. Ngoài ra, tương tự như quy tắc after, tên của một trường khác đang được xác thực có thể được cung cấp làm giá trị của date. |
Before_or_equal (date) |
Tương tự như quy tắc before, chỉ khác là trường đang được xác thực phải là một giá trị trước hoặc bằng với ngày tham chiếu. |
Between (min, max) |
Trường đang được xác thực phải có kích thước nằm giữa giá trị min và max đã cho (bao gồm cả hai giá trị này). Chuỗi, số, mảng và tệp tin sẽ được đánh giá tương tự như quy tắc size. Quy tắc between chỉ kiểm tra phạm vi giá trị của trường, không đảm bảo rằng giá trị có hợp lý hay không. Ví dụ: between:1,10 sẽ hợp lệ cho cả 5, 7.5, và 10. |
boolean |
Trường đang được xác thực phải chuyển đổi được thành kiểu boolean. Các giá trị đầu vào được chấp nhận là true, false, 1, 0, “1”, và “0”. |
confirmed |
Trường đang được xác thực phải có một trường tương ứng để xác nhận, được đặt tên theo dạng {field}_confirmation. Ví dụ, nếu trường đang được xác thực là password, thì phải có một trường password_confirmation tương ứng trong đầu vào. |
contains |
Trường đang được xác thực phải là một mảng chứa tất cả các giá trị tham số đã cho. |
current_password |
Trường đang được xác thực phải khớp với mật khẩu của người dùng đã xác thực. Bạn có thể chỉ định một authentication guard (bộ bảo vệ xác thực) bằng cách sử dụng tham số đầu tiên của quy tắc: ‘password’ => ‘current_password:api’ |
date |
Trường đang được xác thực phải là một ngày hợp lệ theo định dạng tuyệt đối và có thể được xử lý bởi hàm strtotime của PHP. |
date_equals (date) |
Trường đang được xác thực phải bằng với ngày đã cho. Các ngày sẽ được truyền vào hàm strtotime của PHP để được chuyển đổi thành một đối tượng DateTime hợp lệ. |
date_format |
Trường đang được xác thực phải khớp với một trong các định dạng ngày đã cho. Bạn chỉ nên sử dụng date hoặc date_format khi xác thực một trường ngày, không nên sử dụng cả hai. Quy tắc date_format sử dụng hàm DateTime::createFromFormat của PHP để cố gắng chuyển đổi giá trị của trường sang định dạng ngày đã cho. |
decimal (min, max) |
Trường đang được xác thực phải là số và phải chứa một lượng số chữ số thập phân nhất định: // Phải có đúng hai chữ số thập phân (9.99)… ‘price’ => ‘decimal:2’ // Phải có từ 2 đến 4 chữ số thập phân… ‘price’ => ‘decimal:2,4’ |
declined |
Trường đang được xác thực phải có giá trị là “no”, “off”, 0, “0”, false hoặc “false”. Nếu giá trị của trường khớp với một trong các giá trị trên, quy tắc declined sẽ trả về true. |
declined_if |
Trường đang được xác thực phải là “no”, “off”, 0, “0”, false hoặc “false” nếu một trường khác đang được xác thực có giá trị bằng với giá trị đã chỉ định. |
different (field) |
Trường đang được xác thực phải có giá trị khác với trường field đã cho. |
digits (value) |
Số nguyên đang được xác thực phải có độ dài chính xác là value đã cho. |
digits_between (min, max) |
Số nguyên đang được xác thực phải có độ dài nằm giữa min và max đã cho. |
dimensions |
File đang được xác thực phải là hình ảnh và đáp ứng các điều kiện về kích thước theo các tham số được cung cấp cho quy tắc:
‘avatar’ => ‘dimensions:min_width=100,min_height=200’ Các điều kiện có thể sử dụng bao gồm: min_width (chiều rộng tối thiểu), max_width (chiều rộng tối đa), min_height (chiều cao tối thiểu), max_height (chiều cao tối đa), width (chiều rộng), height (chiều cao), ratio (tỷ lệ). Ratio được biểu diễn dưới dạng chiều rộng chia cho chiều cao, theo kiểu phân số (3/2) hoặc số thập phân (1.5). Thêm ratio vào quy tắc dimensions như sau: ‘avatar’ => ‘dimensions:ratio=3/2’ Do quy tắc dimensions yêu cầu nhiều tham số, bạn có thể sử dụng phương thức Rule::dimensions để xây dựng quy tắc một cách linh hoạt: use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule;
Validator::make($data, [ ‘avatar’ => [ ‘required’, Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2), ], ]); |
distinct |
Khi xác thực mảng, trường đang được xác thực không được có bất kỳ giá trị trùng lặp nào:
‘foo.*.id’ => ‘distinct’ Mặc định, quy tắc distinct sử dụng so sánh lỏng (loose). Để sử dụng so sánh chặt (strict), bạn có thể thêm tham số strict vào định nghĩa quy tắc xác thực của bạn. ‘foo.*.id’ => ‘distinct:strict’ Bạn có thể thêm ignore_case vào các đối số của quy tắc xác thực để nó bỏ qua sự khác biệt về chữ hoa, chữ thường: ‘foo.*.id’ => ‘distinct:ignore_case’ |
doesnt_start_with |
Trường đang được xác thực không được bắt đầu bằng một trong các giá trị đã cho. |
doesnt_end_with |
Trường đang được xác thực không được kết thúc bằng một trong các giá trị đã cho. |
|
Trường đang được xác thực phải được định dạng như một địa chỉ email hợp lệ. Quy tắc này sử dụng gói egulias/email-validator để xác thực địa chỉ email. Theo mặc định, bộ kiểm định RFCValidation được áp dụng, nhưng bạn cũng có thể áp dụng các kiểu kiểm định khác:
’email’ => ’email:rfc,dns’ |
ends_with |
Trường đang được xác thực phải kết thúc bằng một trong các giá trị đã cho. |
enum |
Quy tắc Enum là một quy tắc dựa trên lớp giúp xác thực liệu trường đang được xác thực có chứa giá trị enum hợp lệ hay không. Quy tắc enum chỉ chấp nhận tên của enum làm đối số duy nhất cho hàm khởi tạo. Khi xác thực các giá trị cơ bản (primitive values), cần cung cấp một Enum có giá trị tương ứng cho quy tắc enum: use App\Enums\ServerStatus; use Illuminate\Validation\Rule;
$request->validate([ ‘status’ => [Rule::enum(ServerStatus::class)], ]); Các phương thức only và except của quy tắc Enum có thể được sử dụng để giới hạn các trường hợp enum nào được coi là hợp lệ: Rule::enum(ServerStatus::class) ->only([ServerStatus::Pending, ServerStatus::Active]); Rule::enum(ServerStatus::class) ->except([ServerStatus::Pending, ServerStatus::Active]); Phương thức when có thể được sử dụng để điều chỉnh quy tắc Enum theo điều kiện: use Illuminate\Support\Facades\Auth; use Illuminate\Validation\Rule; Rule::enum(ServerStatus::class) ->when( Auth::user()->isAdmin(), fn ($rule) => $rule->only(…), fn ($rule) => $rule->only(…), ); |
exclude |
Trường đang được xác thực sẽ bị loại trừ khỏi dữ liệu yêu cầu được trả về bởi các phương thức validate và validated. |
exclude_if (anotherfield, value) |
Trường đang được xác thực sẽ bị loại trừ khỏi dữ liệu yêu cầu trả về bởi các phương thức validate và validated nếu trường anotherfield bằng với value. Nếu cần logic loại trừ theo điều kiện phức tạp, bạn có thể sử dụng phương thức Rule::excludeIf. Phương thức này chấp nhận một giá trị boolean hoặc một closure (hàm ẩn danh). Khi sử dụng closure, closure cần trả về true hoặc false để chỉ ra xem trường đang được xác thực có nên bị loại trừ hay không: use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; Validator::make($request->all(), [ ‘role_id’ => Rule::excludeIf($request->user()->is_admin), ]); Validator::make($request->all(), [ ‘role_id’ => Rule::excludeIf(fn () => $request->user()->is_admin), ]); |
exclude_unless |
Trường đang được xác thực sẽ bị loại trừ khỏi dữ liệu yêu cầu được trả về bởi các phương thức validate và validated trừ khi trường khác bằng với value. Nếu value là null (ví dụ: exclude_unless:name,null), trường đang xác thực sẽ bị loại trừ, trừ khi trường dùng để so sánh là null hoặc không có trong dữ liệu yêu cầu. |
exclude_with |
Trường đang được xác thực sẽ bị loại trừ khỏi dữ liệu yêu cầu được trả về bởi các phương thức validate và validated nếu trường khác anotherfield có giá trị. |
exclude_without |
Quy tắc exclude_without hoạt động ngược lại với exclude_with. Nó loại trừ một trường khỏi dữ liệu yêu cầu nếu một trường khác không có giá trị. |
exists (table, column) |
Trường đang được xác thực phải tồn tại trong một bảng cơ sở dữ liệu đã cho. Cách sử dụng cơ bản của quy tắc exists: ‘state’ => ‘exists:states’ Nếu tùy chọn column không được chỉ định, tên trường sẽ được sử dụng. Vì vậy, trong trường hợp này, quy tắc sẽ xác thực rằng bảng cơ sở dữ liệu states có chứa một bản ghi với giá trị cột state khớp với giá trị thuộc tính state trong yêu cầu. |
extensions |
Tệp tin đang được xác thực phải có phần mở rộng do người dùng chỉ định tương ứng với một trong các phần mở rộng được liệt kê: ‘photo’ => [‘required’, ‘extensions:jpg,png’], Bạn không nên dựa vào việc xác thực một tệp tin chỉ bằng phần mở rộng do người dùng chỉ định, mà nên luôn luôn kết hợp quy tắc này với quy tắc mimes hoặc mimetypes. |
file |
Trường đang được xác thực phải là một tệp tin đã tải lên thành công. |
filled |
Trường đang được xác thực không được để trống khi nó có mặt. |
gt |
Trường đang được xác thực phải lớn hơn giá trị trường hoặc giá trị đã cho. Hai trường phải cùng loại dữ liệu. Chuỗi, số, mảng và tệp tin được đánh giá bằng cách sử dụng các quy ước tương tự như quy tắc size. |
gte |
Trường đang được xác thực phải lớn hơn hoặc bằng giá trị trường hoặc giá trị đã cho. Hai trường phải cùng loại dữ liệu. Chuỗi, số, mảng và tệp tin được đánh giá bằng cách sử dụng các quy ước tương tự như quy tắc size. |
hex_color |
Giá trị của trường đang được xác thực phải là một mã màu hợp lệ theo định dạng HEX. |
image |
File được upload phải là một hình ảnh (jpg, jpeg, png, bmp, gif, svg, hoặc webp). |
in:foo,bar,… |
Trường đang được xác thực phải nằm trong danh sách các giá trị đã cho. Vì quy tắc này thường yêu cầu bạn nối các phần tử mảng lại với nhau, nên bạn có thể sử dụng phương thức Rule::in để xây dựng quy tắc một cách trôi chảy: use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule;
Validator::make($data, [ ‘zones’ => [ ‘required’, Rule::in([‘first-zone’, ‘second-zone’]), ], ]); Khi kết hợp quy tắc in với quy tắc array, mỗi giá trị trong mảng đầu vào phải có mặt trong danh sách các giá trị được cung cấp cho quy tắc in. |
in_array:anotherfield |
Trường đang được xác thực phải tồn tại trong các giá trị của trường anotherfield. |
integer |
Trường đang được xác thực phải là một số nguyên. |
ip |
Trường đang được xác thực phải là một địa chỉ IP. |
ipv4 |
Trường đang được xác thực phải là một địa chỉ IPv4. |
ipv6 |
Trường đang được xác thực phải là một địa chỉ IPv6. |
json |
Trường đang được xác thực phải là một chuỗi JSON hợp lệ. |
lt |
Trường đang được xác thực phải nhỏ hơn trường đã cho. Hai trường phải cùng loại dữ liệu. Chuỗi, số, mảng và tệp tin được đánh giá theo các quy ước tương tự như quy tắc size. |
lte |
Trường đang được xác thực phải nhỏ hơn hoặc bằng trường đã cho. Hai trường phải cùng loại dữ liệu. Chuỗi, số, mảng và tệp tin được đánh giá theo các quy ước tương tự như quy tắc size. |
lowercase |
Trường đang được xác thực phải là chữ thường. |
list |
Trường đang được xác thực phải là một mảng và là một danh sách. Một mảng được coi là danh sách nếu các khóa của nó bao gồm các số liên tiếp từ 0 đến count($array) – 1. |
mac_address |
Trường đang được xác thực phải là một địa chỉ MAC. |
max |
Trường đang được xác thực phải nhỏ hơn hoặc bằng giá trị tối đa. Chuỗi, số, mảng và tệp tin được đánh giá theo cùng một cách như quy tắc size. |
max_digits:value |
Số nguyên đang được xác thực phải có độ dài tối đa là giá trị (value) đã cho. |
mimetypes:text/plain,… |
Tệp tin đang được xác thực phải khớp với một trong các loại MIME đã cho: ‘video’ => ‘mimetypes:video/avi,video/mpeg,video/quicktime’ Để xác định loại MIME của tệp tin đã tải lên, nội dung của tệp sẽ được đọc và framework sẽ cố gắng đoán loại MIME, có thể khác với loại MIME do khách hàng cung cấp. |
mimes:foo,bar,… |
Tệp tin đang được xác thực phải có loại MIME tương ứng với một trong các phần mở rộng đã liệt kê: ‘photo’ => ‘mimes:jpg,bmp,png’ Mặc dù bạn chỉ cần chỉ định các phần mở rộng, quy tắc này thực tế xác thực loại MIME của tệp bằng cách đọc nội dung của tệp và đoán loại MIME của nó. Xem danh sách đầy đủ các MIME types và các phần mở rộng tương ứng của chúng. |
min:value |
Giá trị của trường đang được xác thực phải có giá trị tối thiểu là value. Chuỗi, số, mảng và tệp tin được đánh giá theo cùng một cách như quy tắc size. |
min_digits:value |
Số nguyên đang được xác thực phải có độ dài tối thiểu là giá trị đã cho. |
multiple_of:value |
Trường đang được xác thực phải là bội số của giá trị đã cho. |
missing |
Trường đang được xác thực không được có mặt trong dữ liệu đầu vào. |
missing_if:anotherfield,value,… |
Trường đang được xác thực không được có mặt nếu trường anotherfield bằng với bất kỳ giá trị (value) nào. |
missing_unless:anotherfield,value |
Trường đang được xác thực không được có mặt trừ khi trường anotherfield bằng với bất kỳ giá trị (value) nào. |
missing_with:foo,bar,… |
Trường đang được xác thực chỉ được phép không có mặt nếu bất kỳ trường nào khác được liệt kê có mặt. |
missing_with_all:foo,bar,… |
Trường đang được xác thực chỉ được phép không có mặt nếu tất cả các trường khác được liệt kê đều có mặt. |
not_in:foo,bar,… |
Trường đang được xác thực không được nằm trong danh sách các giá trị đã cho. Phương thức Rule::notIn có thể được sử dụng để xây dựng quy tắc một cách trôi chảy: use Illuminate\Validation\Rule;
Validator::make($data, [ ‘toppings’ => [ ‘required’, Rule::notIn([‘sprinkles’, ‘cherries’]), ], ]); |
not_regex:pattern |
Trường đang được xác thực không được khớp với biểu thức chính quy đã cho.
Quy tắc này sử dụng hàm preg_match của PHP. Biểu thức pattern được cung cấp cần tuân theo định dạng yêu cầu của preg_match và bao gồm cả dấu phân cách hợp lệ. Ví dụ: ’email’ => ‘not_regex:/^.+$/i’. |
nullable |
Trường đang được xác thực có thể là null. |
numeric |
Trường đang được xác thực phải là số. |
present |
Trường đang được xác thực phải tồn tại trong dữ liệu đầu vào. |
present_if:anotherfield,value,… |
Trường đang được xác thực phải có mặt nếu trường anotherfield bằng với bất kỳ giá trị (value) nào. |
present_unless:anotherfield,value |
Trường đang được xác thực phải có mặt trừ khi trường anotherfield bằng với bất kỳ giá trị nào. |
present_with:foo,bar,… |
Trường đang được xác thực phải có mặt chỉ khi bất kỳ trường nào khác đã được chỉ định có mặt. |
present_with_all:foo,bar,.. |
Trường đang được xác thực phải có mặt chỉ khi tất cả các trường khác đã được chỉ định có mặt. |
prohibited |
Trường đang được xác thực phải không có mặt hoặc trống. Một trường được coi là “trống” nếu nó đáp ứng một trong các tiêu chí sau:
|
prohibited_if:anotherfield,value,… |
Trường đang được xác thực phải không có mặt hoặc trống nếu trường anotherfield bằng với bất kỳ giá trị (value) nào. Một trường được coi là “trống” nếu nó đáp ứng một trong các tiêu chí sau:
Nếu cần logic loại trừ theo điều kiện phức tạp, bạn có thể sử dụng phương thức Rule::prohibitedIf. Phương thức này chấp nhận một giá trị boolean hoặc một closure (hàm ẩn danh). Khi sử dụng closure, closure cần trả về true hoặc false để báo hiệu có nên loại trừ trường cần kiểm định hay không: use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule;
Validator::make($request->all(), [ ‘role_id’ => Rule::prohibitedIf($request->user()->is_admin), ]);
Validator::make($request->all(), [ ‘role_id’ => Rule::prohibitedIf(fn () => $request->user()->is_admin), ]); |
prohibited_unless:anotherfield,value,… |
Trường đang được xác thực phải không có mặt hoặc trống trừ khi trường anotherfield bằng với bất kỳ giá trị nào. Một trường được coi là “trống” nếu nó đáp ứng một trong các tiêu chí sau:
|
prohibits:anotherfield,… |
Nếu trường đang được xác thực không thiếu hoặc trống, tất cả các trường trong anotherfield phải thiếu hoặc trống. Một trường được coi là “trống” nếu nó đáp ứng một trong các tiêu chí sau:
|
regex:pattern |
Trường đang được xác thực phải khớp với biểu thức chính quy đã cho. Quy tắc này sử dụng hàm preg_match của PHP. Biểu thức pattern được cung cấp cần tuân theo định dạng yêu cầu bởi preg_match và do đó cũng bao gồm cả dấu phân cách hợp lệ. Ví dụ: ’email’ => ‘regex:/^.+@.+$/i’ (kiểm tra email). Lưu ý: Khi sử dụng các quy tắc regex (kiểm tra theo biểu thức chính quy) và not_regex (không khớp với biểu thức chính quy), bạn có thể cần phải chỉ định các quy tắc trong một mảng thay vì sử dụng các dấu phân cách |, đặc biệt nếu biểu thức chính quy chứa ký tự |. |
required |
Trường đang được xác thực phải có mặt trong dữ liệu đầu vào và không được trống. Một trường được coi là “trống” nếu nó đáp ứng một trong các tiêu chí sau:
|
required_if:anotherfield,value,… |
Trường đang được xác thực phải có mặt và không được trống nếu trường anotherfield bằng với bất kỳ giá trị (value) nào. Nếu bạn muốn tạo một điều kiện phức tạp hơn cho quy tắc required_if, bạn có thể sử dụng phương thức Rule::requiredIf. Phương thức này chấp nhận một boolean hoặc một closure. Khi được cung cấp một closure, closure này sẽ trả về true hoặc false để xác định xem trường đang được xác thực có bắt buộc hay không: use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule;
Validator::make($request->all(), [ ‘role_id’ => Rule::requiredIf($request->user()->is_admin), ]);
Validator::make($request->all(), [ ‘role_id’ => Rule::requiredIf(fn () => $request->user()->is_admin), ]); |
required_if_accepted:anotherfield,… |
Trường đang được xác thực phải có mặt và không được trống nếu trường anotherfield có giá trị là “yes”, “on”, 1, “1”, true, hoặc “true”. |
required_if_declined:anotherfield,… |
Trường đang được xác thực phải có mặt và không được trống nếu trường anotherfield bằng với “no”, “off”, 0, “0”, false, hoặc “false”. |
required_unless:anotherfield,value,… |
Trường đang được xác thực phải có mặt và không được trống trừ khi trường anotherfield bằng với bất kỳ giá trị nào.
Điều này cũng có nghĩa là trường anotherfield phải có mặt trong dữ liệu yêu cầu trừ khi giá trị là null. Nếu giá trị là null (required_unless:name,null), trường đang được xác thực sẽ bắt buộc trừ khi trường so sánh là null hoặc trường so sánh không có mặt trong dữ liệu yêu cầu. |
required_with:foo,bar,… |
Trường đang được xác thực phải có mặt và không được trống chỉ khi bất kỳ trường nào khác đã được liệt kê có mặt và không trống. |
required_with_all:foo,bar,… |
Trường đang được xác thực phải có mặt và không được trống chỉ khi tất cả các trường khác đã được chỉ định đều có mặt và không trống. |
required_without:foo,bar,… |
Trường đang được xác thực phải có mặt và không được trống chỉ khi bất kỳ trường nào khác đã được chỉ định trống hoặc không có mặt. |
required_without_all:foo,bar,… |
Trường đang được xác thực phải có mặt và không được trống chỉ khi tất cả các trường khác đã được chỉ định đều trống hoặc không có mặt. |
required_array_keys:foo,bar,… |
Trường đang được xác thực phải là một mảng và phải chứa ít nhất các khóa được chỉ định. |
same:field |
Giá trị của trường đang xác thực phải giống hệt với giá trị của trường field. |
size:value |
Trường đang được xác thực phải có kích thước khớp với value đã cho.
Hãy xem một số ví dụ: // Xác thực rằng một chuỗi có chính xác 12 ký tự… ‘title’ => ‘size:12’; // Xác thực rằng một số nguyên được cung cấp bằng 10… ‘seats’ => ‘integer|size:10’; // Xác thực rằng một mảng có chính xác 5 phần tử… ‘tags’ => ‘array|size:5’; // Xác thực rằng một tệp tải lên có chính xác 512 kilobyte… ‘image’ => ‘file|size:512’; |
starts_with:foo,bar,… |
Trường đang được xác thực phải bắt đầu với một trong các giá trị đã cho. |
string |
Trường đang được xác thực phải là một chuỗi. Nếu bạn muốn cho phép trường này có thể là null, bạn nên gán quy tắc nullable cho trường này. |
timezone |
Trường đang được xác thực phải là một mã định danh múi giờ hợp lệ theo phương thức DateTimeZone::listIdentifiers.
Bạn cũng có thể cung cấp các đối số được chấp nhận bởi phương thức DateTimeZone::listIdentifiers cho quy tắc kiểm định này: ‘timezone’ => ‘required|timezone:all’; ‘timezone’ => ‘required|timezone:Africa’; ‘timezone’ => ‘required|timezone:per_country,US’; |
unique:table,column |
Trường đang được xác thực không được tồn tại trong bảng cơ sở dữ liệu đã cho. |
uppercase |
Trường đang được xác thực phải là chữ hoa. |
url |
Trường đang được xác thực phải là một URL hợp lệ. Nếu bạn muốn chỉ định các giao thức URL nào nên được coi là hợp lệ, bạn có thể truyền các giao thức đó làm tham số cho quy tắc xác thực: ‘url’ => ‘url:http,https’, ‘game’ => ‘url:minecraft,steam’, |
ulid |
Trường đang được xác thực phải là một mã định danh duy nhất toàn cầu có thể sắp xếp theo thứ tự từ điển (ULID) hợp lệ. |
uuid |
Trường đang được xác thực phải là một mã định danh duy nhất toàn cầu (UUID) hợp lệ theo RFC 4122 (phiên bản 1, 3, 4 hoặc 5). |
Các quy tắc xác thực Laravel có thể được bổ sung, thay đổi hoặc loại bỏ tùy theo phiên bản. Bên cạnh các quy tắc được liệt kê ở trên, còn nhiều quy tắc khác mà bạn có thể ứng dụng vào quá trình xác thực dữ liệu của mình.
Để cập nhật thông tin chính xác và mới nhất, bạn có thể truy cập tài liệu chính thức của Laravel về Các quy tắc xác thực sẵn có.
Hướng dẫn cách tạo quy tắc Laravel validation
Khi nói đến xác thực dữ liệu cho các website và ứng dụng Laravel, chúng ta thường sử dụng hai cách phương pháp khác nhau: Sử dụng các quy tắc tích hợp sẵn và tạo các quy tắc tùy chỉnh.
Sử dụng các quy tắc Validation tích hợp sẵn
Laravel cung cấp một tập hợp quy tắc xác thực được định nghĩa trước để xử lý các tình huống phổ biến. Bạn có thể tận dụng các quy tắc này trong Controllers và Form Request Classes của mình.
- Controllers: Trong controllers, bạn có thể định nghĩa các quy tắc xác thực trực tiếp trong phương thức như store. Phương thức này trả về một mảng kết hợp, trong đó key là tên trường và value là các quy tắc xác thực được áp dụng cho trường đó.
public function store(Request $request) { $rules = [ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email', ]; // ... phần còn lại của logic controller }
- Form Request Classes: Tạo một lớp form request riêng biệt kế thừa lớp Illuminate\Foundation\Http\FormRequest. Định nghĩa các quy tắc tương tự như controller và sử dụng phương thức authorize để thêm logic ủy quyền.
class StoreUserRequest extends FormRequest { public function rules() { return [ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email', ]; } public function authorize() { return true; // Thay thế bằng logic ủy quyền của bạn } }
Tạo các quy tắc Validation tùy chỉnh
Giả sử tình huống của bạn vượt ra ngoài phạm vi của các quy tắc tích hợp sẵn. Trong trường hợp đó, bạn có thể tạo các quy tắc validation tùy chỉnh. Điều này bao gồm:
- Tạo một lớp quy tắc (rule class): Mở rộng lớp Illuminate\Contracts\Validation\Rule Illuminate\Validation\Rule và định nghĩa hai phương thức:
- passes: Phương thức này nhận giá trị cần xác thực, tên thuộc tính và một hàm callback (tùy chọn). Nó trả về true nếu xác thực thành công, false nếu thất bại.
- message: Phương thức này trả về thông báo lỗi nếu xác thực thất bại.
use Illuminate\Contracts\Validation\Rule; class IsUpperCaseRule extends Rule { public function passes($attribute, $value) { return mb_strtoupper($value) === $value; } public function message() { return 'The :attribute field must be in uppercase.'; } }
- Sử dụng quy tắc tùy chỉnh: Sau khi tạo, bạn có thể sử dụng quy tắc tùy chỉnh của mình như bất kỳ quy tắc tích hợp sẵn nào khác trong phương thức rules:
$rules = [ 'title' => 'required|string|max:255', 'content' => 'required|string', 'custom_field' => [new IsUpperCaseRule], ];
Hoặc trong Form Request Class:
public function rules() { return [ 'title' => 'required|string|max:255', 'content' => 'required|string', 'custom_field' => [new IsUpperCaseRule], ]; }
Lưu ý: Hãy chắc chắn rằng bạn thay thế các placeholder “name” và “email” bằng tên trường thực tế của bạn, cũng như điều chỉnh các quy tắc và thông báo dựa trên yêu cầu của bạn.
Cách áp dụng các quy tắc Laravel Validation
Để áp dụng các quy tắc xác thực trong các trang web hoặc ứng dụng Laravel, bạn cần tích hợp chúng vào quy trình hoạt động của ứng dụng. Có hai phương pháp để thực hiện điều này:
Sử dụng xác thực với Requests
Phương pháp này áp dụng các quy tắc xác thực trong Laravel sử dụng phương thức validate được cung cấp bởi đối tượng Illuminate\Http\Request:
public function store(Request $request) { $rules = [ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email', ]; $request->validate($rules); // ... phần còn lại của logic controller, nơi dữ liệu được đảm bảo hợp lệ }
Trong phương pháp này, phương thức validate nhận các quy tắc xác thực làm tham số. Nó thực hiện xác thực đối với dữ liệu request. Nó cũng thể hiện một ngoại lệ (ValidationException) nếu xác thực thất bại, và tự động chuyển hướng người dùng quay lại URL trước đó.
Sử dụng Form Request Classes
Phương pháp này liên quan đến việc tạo một lớp Form Request riêng biệt:
- Tạo một lớp Form Request: Kế thừa lớp Illuminate\Foundation\Http\FormRequest và định nghĩa các phương thức sau:
- rules: Định nghĩa các quy tắc xác thực trong phương thức này, tương tự như cách tiếp cận trong controller.
- authorize (tùy chọn): Thực hiện bất kỳ logic ủy quyền nào cụ thể cho request.
class StoreUserRequest extends FormRequest { public function rules() { return [ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email', ]; } public function authorize() { return true; // Thay thế bằng logic ủy quyền của bạn } }
Sử dụng lớp Form Request trong Controller
public function store(StoreUserRequest $request) { // Truy cập dữ liệu đã được xác thực trực tiếp từ đối tượng request $name = $request->name; $email = $request->email; // ... phần còn lại của logic controller, nơi dữ liệu được đảm bảo hợp lệ }
Ở đây, lớp StoreUserRequest xử lý xác thực và controller nhận dữ liệu đã được xác thực trực tiếp thông qua đối tượng request. Cách tiếp cận này tách biệt logic xác thực ra khỏi controller để có tổ chức code sạch hơn.
Mặc dù cả hai phương pháp đều hiệu quả, bạn cần chọn phương pháp phù hợp nhất với cấu trúc trang web hoặc ứng dụng của mình.
Cách áp dụng Laravel Validation để xác thực mảng (Array)
Quy tắc array chấp nhận một danh sách các khóa mảng được cho phép. Nếu bất kỳ khóa bổ sung nào xuất hiện trong mảng, việc xác thực sẽ thất bại:
use Illuminate\Support\Facades\Validator; $input = [ 'user' => [ 'name' => 'Taylor Otwell', 'username' => 'taylorotwell', 'admin' => true, ], ]; Validator::make($input, [ 'user' => 'array:name,username', ]);
Lưu ý: Thông thường, bạn nên chỉ định các khóa mảng được phép có mặt trong mảng của mình. Nếu không, các phương thức validate và validated của trình kiểm duyệt sẽ trả về tất cả dữ liệu được xác thực, bao gồm cả mảng và tất cả các khóa của nó, ngay cả khi các khóa đó không được xác thực bởi các quy tắc xác thực mảng lồng nhau khác.
Xác thực mảng lồng nhau
Việc xác thực dữ liệu từ các trường nhập liệu dạng mảng lồng nhau trong Laravel không hề khó khăn như bạn nghĩ. Nhờ “ký hiệu chấm”, bạn có thể dễ dàng kiểm tra các thuộc tính bên trong một mảng.
Giả sử bạn có trường photos[profile] trong yêu cầu HTTP. Để kiểm tra trường này, bạn chỉ cần viết đơn giản như sau:
use Illuminate\Support\Facades\Validator; $validator = Validator::make($request->all(), [ 'photos.profile' => 'required|image', ]);
Xác thực từng phần tử của mảng
Giả sử bạn có một mảng person chứa nhiều người dùng, mỗi người có email và tên. Bạn muốn đảm bảo rằng mỗi email là duy nhất và tên và họ đi kèm với nhau.
Với Laravel, bạn có thể dễ dàng thực hiện điều này bằng cách sử dụng quy tắc validation sau:
$validator = Validator::make($request->all(), [ 'person.*.email' => 'email|unique:users', 'person.*.first_name' => 'required_with:person.*.last_name', ]);
Thông báo lỗi tùy chỉnh cho mảng
Tương tự, Laravel sẽ tạo ra các thông báo lỗi mặc định. Tuy nhiên, bạn có thể tùy chỉnh thông báo lỗi cho phù hợp với ngữ cảnh của mình. Ví dụ:
'custom' => [ 'person.*.email' => [ 'unique' => 'Mỗi người dùng phải có một địa chỉ email duy nhất', ] ],
Truy xuất dữ liệu mảng lồng nhau
Trong một số trường hợp, bạn cần truy cập giá trị của một phần tử cụ thể trong mảng lồng nhau khi thiết lập các quy tắc validation cho thuộc tính. Laravel cung cấp phương thức Rule::forEach để hỗ trợ bạn thực hiện điều này.
Phương thức forEach nhận một closure (hàm ẩn danh) sẽ được gọi cho mỗi lần lặp của thuộc tính mảng đang được xác thực, closure này sẽ nhận hai tham số:
- $value: Giá trị của phần tử mảng hiện tại.
- $attribute: Tên đầy đủ của thuộc tính mảng, bao gồm cả tên mảng cha.
Closure nên trả về một mảng các quy tắc validation sẽ được áp dụng cho phần tử mảng hiện tại:
use App\Rules\HasPermission; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; $validator = Validator::make($request->all(), [ 'companies.*.id' => Rule::forEach(function (string|null $value, string $attribute) { return [ Rule::exists(Company::class, 'id'), new HasPermission('manage-company', $value), ]; }), ]);
Chỉ mục và vị trí trong thông báo lỗi
Khi xác thực các mảng, bạn có thể muốn tham chiếu chỉ mục hoặc vị trí của một mục cụ thể không vượt qua kiểm duyệt trong thông báo lỗi mà ứng dụng của bạn hiển thị. Để thực hiện điều này, bạn có thể bao gồm các placeholder :index (bắt đầu từ 0) và :position (bắt đầu từ 1) trong thông báo kiểm duyệt tùy chỉnh của mình:
use Illuminate\Support\Facades\Validator; $input = [ 'photos' => [ [ 'name' => 'BeachVacation.jpg ] ] ]
Cách áp dụng Laravel Validation để kiểm duyệt file
Laravel cung cấp nhiều quy tắc khác nhau để kiểm tra các file được tải lên, chẳng hạn như mimes (kiểu MIME), image (ảnh), min (dung lượng tối thiểu) và max (dung lượng tối đa).
Mặc dù bạn có thể thiết lập các quy tắc này riêng lẻ, Laravel cũng cung cấp một trình xây dựng quy tắc theo chuỗi (fluent) để việc kiểm duyệt thuận tiện hơn:
use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rules\File; Validator::validate($input, [ 'attachment' => [ 'required', File::types(['mp3', 'wav']) ->min(1024) // Kiểu byte ->max(12 * 1024), // Kiểu byte ], ]);
Kiểm duyệt file ảnh
Nếu ứng dụng của bạn chấp nhận ảnh do người dùng tải lên, bạn có thể sử dụng phương thức khởi tạo image của quy tắc file để yêu cầu file được tải lên phải là một ảnh. Ngoài ra, quy tắc dimensions có thể được sử dụng để giới hạn kích thước của ảnh:
use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; use Illuminate\Validation\Rules\File; Validator::validate($input, [ 'photo' => [ 'required', File::image() ->min(1024) ->max(12 * 1024) ->dimensions(Rule::dimensions()->maxWidth(1000)->maxHeight(500)), ], ]);
Bạn có thể tìm thêm thông tin về việc kiểm tra kích thước ảnh trong tài liệu về quy tắc dimensions.
Kiểm duyệt dung lượng file
Một cách đơn giản, bạn có thể thiết lập dung lượng file tối thiểu và tối đa dưới dạng chuỗi, kèm theo hậu tố cho biết đơn vị dung lượng. Laravel hỗ trợ các đơn vị kb (kilobyte), mb (megabyte), gb (gigabyte) và tb (terabyte):
File::image() ->min('1kb') ->max('10mb')
Kiểm duyệt kiểu file
Mặc dù phương thức types chỉ yêu cầu bạn cung cấp phần mở rộng (như .jpg, .png), nhưng thực tế nó kiểm tra chi tiết hơn, ví dụ như kiểm tra loại MIME của file bằng cách đọc nội dung file và đoán loại MIME của nó.
Ví dụ:
File::types(['jpg', 'png'])
Cách áp dụng Laravel Validation để xác thực mật khẩu
Để đảm bảo mật khẩu đủ độ phức tạp, Laravel cung cấp đối tượng Password:
use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rules\Password; $validator = Validator::make($request->all(), [ 'password' => ['required', 'confirmed', Password::min(8)], ]);
Đối tượng Password cho phép bạn dễ dàng tùy chỉnh các yêu cầu về độ phức tạp của mật khẩu cho ứng dụng của mình, chẳng hạn như chỉ định rằng mật khẩu yêu cầu ít nhất một chữ cái, số, ký hiệu hoặc ký tự có kiểu viết hoa hỗn hợp:
// Yêu cầu ít nhất 8 ký tự... Password::min(8) // Yêu cầu ít nhất 8 chữ cái... Password::min(8)->letters() // Yêu cầu ít nhất một chữ hoa và một chữ thường... Password::min(8)->mixedCase() // Yêu cầu ít nhất một số… Password::min(8)->numbers() // Yêu cầu ít nhất một biểu tượng… Password::min(8)->symbols()
Ngoài ra, bạn có thể đảm bảo rằng mật khẩu không bị lộ trong các vụ rò rỉ dữ liệu mật khẩu công khai bằng cách sử dụng phương thức uncompromised:
Password::min(8)->uncompromised()
Lưu ý về Quyền Riêng Tư
Đối tượng quy tắc Password sử dụng mô hình k-Anonymity để xác định xem mật khẩu có bị rò rỉ qua dịch vụ haveibeenpwned.com mà không xâm phạm quyền riêng tư hoặc bảo mật của người dùng.
haveibeenpwned.com là một dịch vụ miễn phí cung cấp cơ sở dữ liệu về các mật khẩu bị rò rỉ. Theo mặc định, mật khẩu xuất hiện ít nhất một lần trong danh sách rò rỉ sẽ bị đánh giá là rủi ro.
Bạn có thể tùy chỉnh ngưỡng này bằng cách sử dụng đối số đầu tiên của uncompromised:
// Cho phép mật khẩu xuất hiện tối đa 2 lần Password::min(8)->uncompromised(3);
Bạn có thể kết hợp các tùy chọn kiểm tra trong ví dụ trên:
Password::min(8) ->letters() ->mixedCase() ->numbers() ->symbols() ->uncompromised();
Thiết lập các quy tắc kiểm tra mật khẩu mặc định
Thiết lập các quy tắc kiểm tra mật khẩu mặc định cho toàn bộ ứng dụng ở một vị trí thuận tiện có thể giúp bạn tiết kiệm thời gian và công sức. Laravel cung cấp phương thức Password::defaults() để thực hiện điều này. Phương thức này chấp nhận một closure (hàm ẩn danh) trả về cấu hình mặc định của quy tắc Password.
Thông thường, bạn nên đặt closure này trong phương thức khởi động (boot) của một trong các nhà cung cấp dịch vụ cho ứng dụng của bạn:
use Illuminate\Validation\Rules\Password; /** * Bootstrap any application services. */ public function boot(): void { Password::defaults(function () { $rule = Password::min(8); return $this->app->isProduction() ? $rule->mixedCase()->uncompromised() : $rule; }); }
Sau đó, khi bạn muốn áp dụng các quy tắc mặc định cho một mật khẩu cụ thể đang được xác thực, bạn có thể gọi phương thức defaults mà không cần cung cấp đối số:
'password' => ['required', Password::defaults()],
Trong trường hợp bạn muốn đính kèm các quy tắc xác thực bổ sung vào các quy tắc xác thực mật khẩu mặc định của mình, bạn có thể sử dụng phương thức rules để thực hiện điều này:
use App\Rules\ZxcvbnRule; Password::defaults(function () { $rule = Password::min(8)->rules([new ZxcvbnRule]); // ... });
Câu hỏi thường gặp về Laravel Validation
Laravel Validation là gì?
Laravel Validation là một tính năng tích hợp sẵn trong framework Laravel giúp bạn kiểm tra và xác thực dữ liệu đầu vào từ người dùng, đảm bảo dữ liệu hợp lệ trước khi đến bước xử lý tiếp theo.
Có thể tùy chỉnh thông báo lỗi cho các quy tắc Laravel Validation không?
Có, bạn hoàn toàn có thể tùy chỉnh các thông báo lỗi cho các quy tắc validation trong Laravel. Bạn có thể thực hiện điều này bằng hai cách:
- Truyền mảng chứa các thông báo lỗi tùy chỉnh là tham số thứ ba cho phương thức validate.
- Sử dụng phương thức messages trên facade Validator để thiết lập các thông báo lỗi tùy chỉnh cho các trường cụ thể.
Làm thế nào để kiểm thử các quy tắc Laravel Validation?
Laravel cung cấp một lớp Validator tích hợp sẵn để kiểm thử các quy tắc Laravel Validation. Bạn có thể sử dụng các phương thức sau:
- passes: Kiểm tra xem dữ liệu đầu vào có vượt qua tất cả các quy tắc không. Phương thức này trả về true nếu dữ liệu hợp lệ, false nếu không.
- fails: Kiểm tra xem có bất kỳ quy tắc nào không vượt qua hay không. Phương thức này trả về true nếu có lỗi validation, false nếu không.
Ngoài ra, bạn có thể sử dụng facade Validator trong các bài kiểm tra đơn vị (unit test) để kiểm thử các quy tắc validation.
Tổng kết Laravel Validation
Laravel Validation đóng vai trò vô cùng quan trọng trong việc bảo mật và đảm bảo tính chính xác cho dữ liệu, đảm bảo dữ liệu tuân thủ theo các quy tắc do bạn đặt ra. Laravel cung cấp đa dạng phương thức kiểm tra dữ liệu, giúp bạn dễ dàng quản lý và kiểm soát dữ liệu đầu vào. Việc nắm vững cách tạo và áp dụng các quy tắc Laravel validation không chỉ giúp bạn xây dựng các ứng dụng web an toàn hơn mà còn nâng cao chất lượng mã nguồn. Ngoài ra, hãy tiếp tục khám phá và tận dụng các tính năng mạnh mẽ của Laravel để phát triển những ứng dụng web chất lượng cao.