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 phương thức static make của SkillDo\Validate\Rule (trả về đối tượng SkillDo\Validate\RuleCollection chứa chuỗi các quy tắc):
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 một mảng các quy tắc (['field' => Rule::make()...]) 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 errors, 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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $trim | bool | Nếu true value sẽ được lượt bỏ khoản trắng trước khi kiểm tra | true |
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
numerichoặcinteger) - Mãng (array) : dựa trên số lượng phân tử
Tham số:
| Params | Đối số | Type | Description | Default |
|---|---|---|---|---|
| $min | int | Giá trị nhỏ nhất field cần đáp ứng | ||
| $max | int | Giá trị lớn nhất field có thể nhận vào | ||
| $equal | bool | Nếu true cho phép giá trị cần so sánh được phép bằng nhau | true |
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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $types | array | Loạ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ợ:
| Type | Ví dụ |
|---|---|
| hex | #0000FF, #00F |
| rgb | rgb(255, 255, 255) |
| rgba | rgba(255, 255, 255, 1) |
| keyword | transparent, 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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $format | string | format kiểu ngày tháng năm sẽ so sánh | d/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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $time | string | Thời gian cần so sánh | |
| $format | string | format kiểu ngày tháng năm sẽ so sánh | d/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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $time | string | Thời gian cần so sánh | |
| $format | string | format kiểu ngày tháng năm sẽ so sánh | d/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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $data | string | Tên field lấy giá trị so sánh hoặc chuổi so sanh | |
| $type | string | Nếu type là input $data được xem như tên field, nếu type là string data được xem như chuổi string | string |
$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ố | Type | Description | Default |
|---|---|---|---|---|
| array $args | thousandsSeparator | string | Dấ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 |
| decimalSeparator | string | Dấ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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $fieldName | string | Tên trường dữ liệu cần so sánh | |
| $fieldId | string | id trường dữ liệu cần so sánh, dùng khi so sánh ở frontend | |
| $equal | bool | cho phép giá trị 2 trường bằng nhau | true |
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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $max | float | Con số để so sánh | |
| $equal | bool | cho phép giá trị 2 trường bằng nhau | true |
| $type | string | ép kiểu dữ liệu so sánh (string, numeric, array, file), nếu không truyền sẽ tự nhận diện theo value | null |
Rule::make()->max(float $max, bool $equal = true, $type = null);
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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $fieldName | string | Tên trường dữ liệu cần so sánh | |
| $fieldId | string | id trường dữ liệu cần so sánh, dùng khi so sánh ở frontend | |
| $equal | bool | cho phép giá trị 2 trường bằng nhau | true |
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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $min | float | Con số để so sánh | |
| $equal | bool | cho phép giá trị 2 trường bằng nhau | true |
| $type | string | ép kiểu dữ liệu so sánh (string, numeric, array, file), nếu không truyền sẽ tự nhận diện theo value | null |
Rule::make()->min(float $min, bool $equal = true, $type = null);
string
Trường được xác thực phải là một chuỗi (hoặc số)
Rule::make()->string();
array
Trường được xác thực phải là một mảng
Rule::make()->array();
file
Xác thực file tải lên (đuôi file và kích thước file)
Tham số:
| Params | Đối số | Type | Description | Default |
|---|---|---|---|---|
| $types | array | Danh sách đuôi file cho phép (jpg, png, pdf...) | ||
| array $args | min | mixed | Kích thước file tối thiểu (số bytes hoặc chuỗi như 500KB) | 0 |
| max | mixed | Kích thước file tối đa (số bytes hoặc chuỗi như 2MB) | 0 |
Rule::make()->file(['jpg', 'png'], ['min' => '10KB', 'max' => '2MB']);
url
Xác thực địa chỉ URL
Tham số:
| Params | Đối số | Type | Description | Default |
|---|---|---|---|---|
| array $args | protocol | string | Các giao thức | http, https |
| allowEmptyProtocol | bool | Nếu true cho phép không cần giao thức | false |
Rule::make()->url(array $args);
unique
Xác thực value là duy nhất
Tham số:
| Params | Đối số | Type | Description | Default |
|---|---|---|---|---|
| $table | string | Table lấy dữ liệu trong database | ||
| $column | string | Cột so sánh trong table | ||
| array $args | ignore | string | Giá trị bỏ qua không cần so sánh | |
| ignore_column | string | Cột bỏ qua giá trị ignore, nếu không điền sẽ lấy cột $column | ||
| callback | Closure | Function callback điều chỉnh điều kiện so sánh dữ liệu, nhận vào và trả về query builder | ||
| handleValue | Closure | Function xử lý lại value trước khi so sánh |
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 (\Illuminate\Database\Query\Builder $query) {
$query->where('status', 'public');
return $query;
}
]);
//kiểm tra phone của những users có trạng thái public có trùng lập không
Rule
uniquechỉ xác thực ở server, không xác thực ở client (JS)
phone
Kiểm tra số điện thoại
Tham số:
| Params | Type | Description | Default |
|---|---|---|---|
| $country | array | Quốc gia | vi |
Rule::make()->phone(['vi', 'zh']);
Các quốc gia được hỗ trợ:
| Key | Name |
|---|---|
| vi | Việt Nam |
| zh | Trung Quốc |
| ja | Nhật Bản |
| en | Nướ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ố:
| Params | Type | Description | Default |
|---|---|---|---|
| $data | array | danh sách giá trị cho trước |
Rule::make()->in(['pending', 'confirm', 'cancel']);
requiredIf
Kiểm tra giá trị nhập vào là bắt buộc theo một điều kiện cho trước
Tham số:
| Params | Type | Description | Default |
|---|---|---|---|
| $callback | callable | method điều kiện |
Rule::make()->requiredIf(function ($request) {
return $request->has('filter1')
});
custom
Kiểm tra giá trị nhập vào dự theo function custom của bạn
Tham số:
| Params | Type | Description | Default |
|---|---|---|---|
| $closure | Closure | function kiểm tra trả về true nếu hợp lệ và false nếu không hợp lệ | |
| $message | string | message lỗi khi 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 (lấy từ file ngôn ngữ validation).
Nếu cần, bạn có thể thay thông báo lỗi mặc định bằng thông báo của riêng bạn bằng cách ghi đè key message của từng rule trong thuộc tính public rules của RuleCollection. Message hỗ trợ placeholder :attribute (label của field) và các tham số của rule (:max, :min...):
use SkillDo\Validate\Rule;
$rule = Rule::make('My Field')->notEmpty()->integer()->max(10);
$rule->rules['notEmpty']['message'] = 'Không được để trống trường :attribute';
//Các rule so sánh theo kiểu dữ liệu (min, max, between, file) có message là mảng con theo kiểu
$rule->rules['max']['message']['numeric'] = 'Vui lòng điền số cho trường :attribute nhỏ hơn :max';
$form = new Form();
$form->text('myField', [
'label' => 'My Field',
'validations' => $rule
]);
Riêng rule custom nhận message lỗi qua tham số thứ 2:
Rule::make('My Field')->custom(function ($value) {
return is_numeric($value);
}, 'Trường :attribute ph ải là số');
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ợ
| Params | Cần thêm | Description |
|---|---|---|
| alpha | ||
| alphaDash | ||
| alphaNum | ||
| alphaSpaces | ||
| notEmpty | ||
| color | ||
| colorRGB | ||
| colorRGBA | ||
| colorHEX | ||
| ip | ||
| ipv4 | ||
| ipv6 | ||
| identical | ||
| file | ||
| lessThan | phải truyền $fieldId khi tạo rule | |
| greaterThan | phải truyền $fieldId khi tạo rule | |
| phone | ||
| between | phải có rule là string, file, numeric hoặc integer | |
| min | phải có rule là string, file, numeric hoặc integer | |
| max | phải có rule là string, file, numeric hoặc integer | |
| date | ||
| before | ||
| after |
Rule
uniquechỉ chạy ở server, không được xác thực ở client