Phần trước mình đã giới thiệu với mọi người các cách khai báo validation trong Laravel rồi, phần này mình sẽ giới thiệu với mọi người các cách hiển thị error, thêm rule trong validation.
1. Hiển thị error massage.
Khi thực hiện validate data, nếu như không pass thì Laravel sẽ return về một MassageBag
(Illuminate\Support\MessageBag
) chứa các error massage. Và Laravel sẽ tự động gán MassageBag
vào trong $errors
trong views.
Để lấy ra error message đầu tiên của một field các bạn sử dụng phương thức first
.
VD: Lấy ra error message lỗi đầu tiên của trường email
.
$errors = $validator->errors();
echo $errors->first('email');
Hoặc trong blade
{{ $errors->first('email') }}
Để lấy ra tất cả message của một trường nào đó các bạn có thể sử dụng phương thức get
. Hàm này sẽ trả về một mảng các message lỗi của trường đó.
VD: In ra tất cả các message lỗi của trường email
.
foreach ($errors->get('email') as $message) {
//
}
Nếu input của bạn là một mảng, bạn có thể lấy ra tất cả error message trong mảng input key đó bằng cách sử dụng ký tự '*
'.
VD: Lấy ra error massage của các attachments
.
foreach ($errors->get('attachments.*') as $message) {
//
}
Còn trong trường hợp bạn muốn lấy ra tất cả các các error message của validator, bạn có thể sử dụng phương thức all
.
VD: lấy ra tất cả các error message.
foreach ($errors->all() as $message) {
//
}
Đôi lúc, bạn sẽ cần kiểm tra xem trường nào đó có tồn tại error message hay không, bạn có thể sử dụng phương thức has
. Phương thức này sẽ trả về true nếu trường đó có error message.
VD: Kiểm tra xem validate input email
có sai hay không.
if ($errors->has('email')) {
//
}
2. Sửa nội dung error message.
Mặc định các message trong Laravel được đặt trong resources/lang/en/validation.php
.
Và nếu như bạn muốn thay đổi nội dung message cho một trường nào đó, bạn có thể thêm vào trong key custom
.
VD: Thay đổi error mesage cho trường email với rule reqruire và max.
'custom' => [
'email' => [
'required' => 'We need to know your email address!',
'max' => 'Your email address is too long!'
],
],
Tương tự bạn cũng có thể custom attribute trong file language, bằng cách thiết lập trong key attribute
.
VD: thay đổi attribute name của trường email
.
'attributes' => [
'email' => 'email address',
],
3. Các rule có sẵn trong Laravel.
Do Laravel cung cấp rất nhiều rule, nên mình chỉ liệt kê ra một số rule hay dùng thôi. Các bạn có thể xem toàn bộ những rule mà Laravel hỗ trợ sẵn tại đây.
Rule | Mô Tả |
accepted | Rule này chỉ chấp nhận các giá trị "yes" , "on" , 1 , hoặc true . Rule này thường được dùng cho các input là radio, checkbox. |
active_url | Rule này sẽ kiểm tra xem URL này có đang thực sự tồn tại, bằng việc sử dụng hàm dns_get_record trong PHP. |
after |
Rule này sẽ kiểm tra xem ngày tháng có đang lớn hơn giá trị cần so sánh không. VD: 'start_date' => 'required|date|after:tomorrow' |
before | Rule này tương tự after nhưng là so sánh nhỏ hơn. |
alpha | Rule này sẽ kiểm tra xem data gửi lên có phải là các ký tự alphabetic. |
alpha_num | Rule này sẽ kiểm tra xem dữ liệu có phải là các kí tự alphabetic và số. |
array | Rule này sẽ kiểm tra xem dữ liệu có phải là array. |
bail | Rule này sẽ dừng việc validate dữ liệu nếu như có một rule nào đó fail. |
between:min,max | Rule này sẽ kiểm tra xem giá trị có nằm trong khoảng min, max hay không |
confirmed |
Rule này sẽ kiểm tra xem dữ liệu có giống với dữ liệu của VD: Với trường hợp xác thực |
date | Kiểm tra xem dữ liệu gửi lên có phải là date không. |
dimensions |
Rule này sẽ kiểm tra kích thước của ảnh upload lên. VD: |
Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là email. | |
image | Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải image. |
in_array:anotherfield | Rule này sẽ kiểm tra xem dữ liệu gửi lên có nằm trong mảng anotherfield. |
integer | Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải số nguyên hay không. |
ip | Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là ip. |
ipv4 | Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là ipv4. |
ipv6 | Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là ipv6. |
json | Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là một json string. |
max:value | Rule này sẽ kiểm tra xem dữ liệu có nhỏ hơn giá trị value. |
min:value | Rule này sẽ kiểm tra xem dữ liệu có lớn hơn giá trị value. |
not_in:foo,bar | Rule này sẽ kiểm tra xem dữ liệu gửi lên không nằm trong mảng. |
nullable | Rule này sẽ cho phép không cần dữ liệu gửi lên. |
numberic | Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là numeric hay không. |
regex:pattern | Rule này sẽ kiểm tra xem dữ liệu phải matching vơi pattern. |
required | Rule này sẽ bắt buộc trường phải có dữ liệu. |
string | Rule này sẽ bắt buộc dữ liệu phải là string. |
unique:table,column,except,idColumn | Rule này sẽ kiểm tra dữ liệu bắt buộc phải chưa xuất hiện với điều kiện ở trong database. |
url | Rule này bắt buộc dữ liệu gửi lên phải là một URL. |
3. Thêm mới rule trong Laravel.
Nếu như các rule mà Laravel cung cấp không giải quyết được vấn đề của bạn. Bạn có thể tạo mới một rule theo cách của bạn một cách đơn giản bằng cách sử dụng command make:rule
. Command này sẽ tạo ra một rule trong app/Rules
cho các bạn viết logic vào trong.
VD: Tạo thêm rule Uppercase
để kiểm tra xem data có phải đang ở dạng chữ in hoa hay không.
php artisan make:rule Uppercase
Lúc này file rule sẽ có dạng như sau:
- app/Rules/Uppercase.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Uppercase implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
//
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The validation error message.';
}
}
Trong đó:
- Phương thức
passes
mà trả vềtrue
thì rule sẽ được pass và ngược lại. - Phương thức
massage
sẽ trả về message string nếu như rule không pass.
Lúc này khi muốn sử dụng rule vào validator bạn chỉ sử dụng như sau:
use App\Rules\Uppercase;
$request->validate([
'name' => ['required', 'string', new Uppercase],
]);
Ngoài cách tạo thêm rule trên, bạn cũng có thể đưa logic vào trong một closure
với cú pháp:
function ($attribute, $value, $fail) {
if ($value === 'foo') {
$fail('The '.$attribute.' is invalid.');
}
}
Trong đó:
$attribute
là tên của trường cần validate.$value
là giá trị của trường cần validate.$fail
là một callback function sẽ được gọi khi validate fail.
VD:
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'title' => [
'required',
'max:255',
function ($attribute, $value, $fail) {
if ($value === 'foo') {
$fail('The '.$attribute.' is invalid.');
}
},
],
]);
4. Lời kết.
Như vậy mình đã giới thiệu xong với mọi người về validation trong Laravel rồi, các bạn cũng không cần thiết phải nhớ hết các rule trong Laravel vì nó khá là nhiều, lúc nào cần có thế lên docs xem cũng được.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
mit
4 năm trước