Nhảy tới nội dung
Phiên bản: 7.1.0

Validation

Khởi Tạo Xác Thực

Để xác thực cho form bạn cần thêm quy tắc xác thực vào field khi khởi tạo, Quy tắc xác thực được tạo bằng đối tượng SkillDo\Validate\Rule:

use SkillDo\Validate\Rule;
$form = new Form();
$form->text('myField', [
'label' => 'My Field',
'validations' => Rule::make()->notEmpty()
]);

Xác Thực

Xác thực bằng form

Để xác thực các request của một form đã hợp lệ hay chưa bạn sử dụng phương thức validate của class SkillDo\Http\Request. Phương thức validate của request nhận vào một đối số có thể là đối tượng Form, FormAdmin hoặc SkillDo\Validate\Rule và trả về đối tượng SkillDo\Validate\Validate

use SkillDo\Validate\Rule;
//Tạo form
$form = new Form();
$form->text('myField', [
'label' => 'My Field',
'validations' => Rule::make()->notEmpty()
]);

//Xác thực
$request = request();

$validate = $request->validate($form);

Để kiểm tra request đã hợp lệ hay chưa bạn có thể sử dụng phương thức fails, nếu trả về true tức có request không hợp lệ, hoặc passes (ngược lại với fails)

$validate = $request->validate($form);
if($validate->fails()) {
//todo fail validation
}

Để lấy danh sách message lỗi khi xác thực bạn sử dụng phương thức error, phương thức sẽ trả về một đối tượng là SKD_Error

$validate = $request->validate($form);

if($validate->fails()) {

$errors = $validate->errors();
}

Xác thực không form

Hoặc bạn có thể tạo validate mà không cần form bằng cách sử dụng phương thức validate của SkillDo\Http\Request hoặc make của SkillDo\Validate\Validate.

use SkillDo\Validate\Validate;
use SkillDo\Validate\Rule;

$request = request();

$validate = $request->validate([
'username' => Rule::make('Tên đăng nhập')->notEmpty(),
'password' => Rule::make('Mật khẩu')->notEmpty(),
]);

if($validate->fails()) {
$errors = $validate->errors();
}

hoặc

use SkillDo\Validate\Validate;
use SkillDo\Validate\Rule;

$request = request();

$validate = Validate::make($request->all(), [
'username' => Rule::make('Tên đăng nhập')->notEmpty(),
'password' => Rule::make('Mật khẩu')->notEmpty(),
])->validate();

if($validate->fails()) {
$errors = $validate->errors();
}

Các Quy Tắc Xác Thực

alpha

Trường được xác thực phải hoàn toàn là các ký tự chữ cái Unicode.

Rule::make()->alpha();

alphaDash

Trường được xác thực phải hoàn toàn là các ký tự chữ (a-z, A-Z), số (0-9), dấu gạch ngang (-) và dấu gạch dưới (_).

Rule::make()->alphaDash();

alphaNum

Trường được xác thực phải hoàn toàn là các ký tự chữ (a-z, A-Z) và số (0-9).

Rule::make()->alphaNum();

alphaSpaces

Trường được xác thực phải hoàn toàn là các ký tự chữ và dấu cách.

Rule::make()->alphaSpaces();

notEmpty

Kiểm tra xem giá trị input có phải là chuỗi rỗng không

Tham số:

ParamsTypeDescriptionDefault
$trimboolNếu true value sẽ được lượt bỏ khoản trắng trước khi kiểm tratrue
Rule::make()->notEmpty(true);

Between

Kiểm tra xem giá trị đầu vào có nằm giữa (đúng hay không) hai số đã cho.

Giá trị đầu vào có thể là

  • Chuỗi (string) : dựa trên độ dài (khi đi kèm điều kiện xác thực string)
  • Số (number) : dựa trên độ lớn (khi đi kèm điều kiện xác thực numeric hoặc integer)
  • Mãng (array) : dựa trên số lượng phân tử

Tham số:

ParamsĐối sốTypeDescriptionDefault
$minintGiá trị nhỏ nhất field cần đáp ứng
$maxintGiá trị lớn nhất field có thể nhận vào
$equalboolNếu true cho phép giá trị cần so sánh được phép bằng nhautrue
Rule::make()->between(int $min, int $max, bool $equal);

color

Xác thực màu ở các định dạng khác nhau

Tham số:

ParamsTypeDescriptionDefault
$typesarrayLoại mã màu (rgb, rgba, hex, keyword),rgb, rgba, hex, keyword
Rule::make()->color(['rgb', 'hex']);

Kiểu các loại được hỗ trợ:

TypeVí dụ
hex#0000FF, #00F
rgbrgb(255, 255, 255)
rgbargba(255, 255, 255, 1)
keywordtransparent, red

colorRGB

Xác thực màu ở các định dạng rgb như rgb(255, 255, 255)

Rule::make()->colorRGB();

colorRGBA

Xác thực màu ở các định dạng rgba như rgba(255, 255, 255, 1)

Rule::make()->colorRGBA();

colorHex

Xác thực màu ở các định dạng hex như #0000FF, #00F

Rule::make()->colorHex();

date

Xác thực định dạng ngày tháng năm

Tham số:

ParamsTypeDescriptionDefault
$formatstringformat kiểu ngày tháng năm sẽ so sánhd/m/Y
Rule::make()->date('d/m/Y');

before

Trường được xác thực phải là giá trị trước ngày đã cho

Tham số:

ParamsTypeDescriptionDefault
$timestringThời gian cần so sánh
$formatstringformat kiểu ngày tháng năm sẽ so sánhd/m/Y
Rule::make()->before('10/06/2024', 'd/m/Y');

after

Trường được xác thực phải là giá trị sau ngày đã cho

Tham số:

ParamsTypeDescriptionDefault
$timestringThời gian cần so sánh
$formatstringformat kiểu ngày tháng năm sẽ so sánhd/m/Y
Rule::make()->after('10/06/2024', 'd/m/Y');

identical

Kiểm tra xem giá trị có giống với một trong các giá trị đã cho không

Tham số:

ParamsTypeDescriptionDefault
$datastringTên field lấy giá trị so sánh hoặc chuổi so sanh
$typestringNếu type là input $data được xem như tên field, nếu type là string data được xem như chuổi stringstring
$form->password('password', [
'label' => 'Nhập mật khẩu',
'validations' => Rule::make()->notEmpty()
]);
$form->password('re_password', [
'label' => 'Nhập lại mật khẩu',
'validations' => Rule::make()
->notEmpty()
->identical('password', 'input')
]);
//giá trị nhập vào field re_password phải giống với field password

digits

Kiểm tra xem dữ liệu đầu vào chỉ chứa các chữ số

Rule::make()->digits();

numeric

Kiểm tra xem giá trị có phải là số không

Rule::make()->numeric();

integer

Kiểm tra đầu vào có phải là số nguyên

Tham số:

ParamsĐối sốTypeDescriptionDefault
array $argsthousandsSeparatorstringDấu phân cách hàng ngàng (trống, dấu cách, dấu phẩy, dấu chấm)trống
decimalSeparatorstringDấu phân cách hàng thập phân (dấu phẩy, dấu chấm)dấu chấm (.)
Rule::make()->integer($args);

email

Xác thực đúng định dạng địa chỉ email

Rule::make()->email();

ip

Xác thực địa chỉ IP (ipv4 hoặc ipv6)

Rule::make()->ip();

ipv4

Xác thực địa chỉ IP v4

Rule::make()->ipv4();

ipv6

Xác thực địa chỉ IP v6

Rule::make()->ipv6();

lessThan

So sánh giá trị hai trường dữ liệu, Trường đượ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. Đối với dữ liệu chuỗi (string), giá trị tương ứng với số ký tự. Đối với dữ liệu số (numeric), giá trị tương ứng với một giá trị nguyên nhất định (phải đi kèm validate rule số hoặc số nguyên). Đối với một mảng, kích thước tương ứng với số lượng (count) của mảng

Tham số:

ParamsTypeDescriptionDefault
$fieldNamestringTên trường dữ liệu cần so sánh
$fieldIdstringid trường dữ liệu cần so sánh, dùng khi so sánh ở frontend
$equalboolcho phép giá trị 2 trường bằng nhautrue
Rule::make()->lessThan(string $fieldName, string $fieldId, bool $equal);

max

Kiểm tra xem giá trị trường được kiểm tra có nhỏ hơn hoặc bằng số đã cho không

Tham số:

ParamsTypeDescriptionDefault
$maxfloatCon số để so sánh
$equalboolcho phép giá trị 2 trường bằng nhautrue
Rule::make()->max(float $max, bool $equal);

greaterThan

So sánh giá trị hai trường dữ liệu, Trường được xác thực phải lớn hơn trường đã cho. Hai trường phải cùng loại dữ liệu. Đối với dữ liệu chuỗi (string), giá trị tương ứng với số ký tự. Đối với dữ liệu số (numeric), giá trị tương ứng với một giá trị nguyên nhất định (phải đi kèm validate rule số hoặc số nguyên). Đối với một mảng, kích thước tương ứng với số lượng (count) của mảng

Tham số:

ParamsTypeDescriptionDefault
$fieldNamestringTên trường dữ liệu cần so sánh
$fieldIdstringid trường dữ liệu cần so sánh, dùng khi so sánh ở frontend
$equalboolcho phép giá trị 2 trường bằng nhautrue
Rule::make()->greaterThan(string $fieldName, string $fieldId, bool $equal);

min

Kiểm tra xem giá trị trường được kiểm tra có lớn hơn hoặc bằng số đã cho không

Tham số:

ParamsTypeDescriptionDefault
$minfloatCon số để so sánh
$equalboolcho phép giá trị 2 trường bằng nhautrue
Rule::make()->min(float $min, bool $equal);

string

Trường được xác thực phải là một chuỗi

Rule::make()->string();

url

Xác thực địa chỉ URL

Tham số:

ParamsĐối sốTypeDescriptionDefault
array $argsprotocolstringCác giao thứchttp, https
allowEmptyProtocolboolNếu true cho phép không cần giao thứcfalse
Rule::make()->url(array $args);

unique

Xác thực value là duy nhất

Tham số:

ParamsĐối sốTypeDescriptionDefault
$tablestringTable lấy dữ liệu trong database
$columnstringCột so sánh trong table
array $argsignorestringGiá trị bỏ qua không cần so sánh
ignore_columnstringCột bỏ qua giá trị ignore, nếu không điền sẽ lấy cột $column
callbackclouseFunction callback điều chỉnh điều kiện so sánh dữ liệu
Rule::make()->unique('users', 'email', [
'ignore' => 'admin@gmail.com'
]);
//kiểm tra email của users có trùng lập không nhưng bỏ qua nếu field trùng với admin@gmail.com

Rule::make()->unique('users', 'phone', [
'callback' => function (Qr $args) {
$args->where('status', 'public');
return $args;
}
]);
//kiểm tra email của những users có trạng thái public có trùng lập không

phone

Kiểm tra số điện thoại

Tham số:

ParamsTypeDescriptionDefault
$countryarrayQuốc giavi
Rule::make()->phone(['vi', 'zh']);

Các quốc gia được hỗ trợ:

KeyName
viViệt Nam
zhTrung Quốc
jaNhật Bản
enNước Anh

in

Kiểm tra giá trị nhập vào có nằm trong danh sách giá trị cho trước

Tham số:

ParamsTypeDescriptionDefault
$dataarraydanh sách giá trị cho trước
Rule::make()->in(['pending', 'confirm', 'cancel']);

custom

Kiểm tra giá trị nhập vào dự theo function custom của bạn

Tham số:

ParamsTypeDescriptionDefault
$closureClosurefunction kiểm tra trả về true nếu hợp lệ và false nếu không hợp lệ
Rule::make()->custom(function ($value) {

if(!is_numeric($value)) return false;

return $value%2;
});

Error Messages

Sau khi xác thực, nếu xác thực bị fail hệ thống sẽ trả về cho bạn một đối tượng SKD_Error trong đó chứa các thông báo lỗi mặc định. Nếu cần, bạn có thể cung cấp các thông báo lỗi của bạn cho phiên bản trình xác thực thay vì các thông báo lỗi mặc định do Skilldo cung cấp. bằng cách sử dụng phương thức errorMessage:

use SkillDo\Validate\Rule;

$form = new Form();

$form->text('myField', [
'label' => 'My Field',
'validations' => Rule::make()
->notEmpty()
->integer()
->max(10)
->errorMessage([
'notEmpty' => 'Không được để trống trường :attribute',
'max' => [
'numeric' => 'Vui long điền số cho trường :attribute nhỏ hơn :max'
]
])
]);

Hoặc

use SkillDo\Validate\Validate;
use SkillDo\Validate\Rule;

$request = request();

$validate = $request->validate([
'myField' => Rule::make()->notEmpty()->integer()->max(10)
->errorMessage([
'notEmpty' => 'Không được để trống trường :attribute',
'max' => [
'numeric' => 'Vui long điền số cho trường :attribute nhỏ hơn :max'
]
]),
]);

if($validate->fails()) {
$errors = $validate->errors();
}

Xác Thực JS

Ngoài xác thực trên server cms còn cung cấp xác thực trên client khi setIsValid của form được bật, sau đây là danh sách rule được hỗ trợ

ParamsCần thêmDescription
alpha
alphaDash
alphaNum
alphaSpaces
notEmpty
color
colorRGB
colorRGBA
colorHex
ip
ipv4
ipv6
ipv6
file
lessThan
email
phone
betweenphải có rule là string, file, numeric hoặc integer
minphải có rule là string, file, numeric hoặc integer
maxphải có rule là string, file, numeric hoặc integer
date
before
after