Trình xác nhận
Có nhiều trình xác nhận có sẵn trực tiếp trong composer, ví dụ:
top-think/think-validate
respect/validation
Trình xác nhận top-think/think-validate
Giới thiệu
Trình xác nhận chính thức của ThinkPHP
Địa chỉ dự án
https://github.com/top-think/think-validate
Cài đặt
composer require topthink/think-validate
Bắt đầu nhanh
Tạo mới app/index/validate/User.php
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
protected $message = [
'name.require' => 'Tên là bắt buộc',
'name.max' => 'Tên không được vượt quá 25 ký tự',
'age.number' => 'Tuổi phải là số',
'age.between' => 'Tuổi phải nằm trong khoảng từ 1 đến 120',
'email' => 'Định dạng email không đúng',
];
}
Sử dụng
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$validate = new \app\index\validate\User;
if (!$validate->check($data)) {
var_dump($validate->getError());
}
Trình xác nhận workerman/validation
Giới thiệu
Dự án này là bản dịch tiếng Trung của https://github.com/Respect/Validation
Địa chỉ dự án
https://github.com/walkor/validation
Cài đặt
composer require workerman/validation
Bắt đầu nhanh
<?php
namespace app\controller;
use support\Request;
use Respect\Validation\Validator as v;
use support\Db;
class IndexController
{
public function index(Request $request)
{
$data = v::input($request->post(), [
'nickname' => v::length(1, 64)->setName('Tên hiển thị'),
'username' => v::alnum()->length(5, 64)->setName('Tên người dùng'),
'password' => v::length(5, 64)->setName('Mật khẩu')
]);
Db::table('user')->insert($data);
return json(['code' => 0, 'msg' => 'ok']);
}
}
Truy cập thông qua jquery
$.ajax({
url : 'http://127.0.0.1:8787',
type : "post",
dataType:'json',
data : {nickname:'Tom', username:'tom cat', password: '123456'}
});
Kết quả:
{"code":500,"msg":"Tên người dùng chỉ có thể chứa chữ cái (a-z) và số (0-9)"}
Giải thích:
v::input(array $input, array $rules)
được sử dụng để xác nhận và thu thập dữ liệu. Nếu việc xác nhận dữ liệu thất bại, nó sẽ ném ra ngoại lệ Respect\Validation\Exceptions\ValidationException
, nếu xác nhận thành công, dữ liệu đã được xác nhận (dạng mảng) sẽ được trả về.
Nếu mã doanh nghiệp không xử lý ngoại lệ xác nhận, framework webman sẽ tự động xử lý và dựa trên tiêu đề yêu cầu HTTP để chọn trả về dữ liệu json (giống như {"code":500, "msg":"xxx"}
) hoặc trang ngoại lệ thông thường. Nếu định dạng trả về không phù hợp với yêu cầu của doanh nghiệp, người phát triển có thể tự mình xử lý ngoại lệ ValidationException
và trả về dữ liệu cần thiết, tương tự như ví dụ dưới đây:
<?php
namespace app\controller;
use support\Request;
use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\ValidationException;
class IndexController
{
public function index(Request $request)
{
try {
$data = v::input($request->post(), [
'username' => v::alnum()->length(5, 64)->setName('Tên người dùng'),
'password' => v::length(5, 64)->setName('Mật khẩu')
]);
} catch (ValidationException $e) {
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);
}
}
Hướng dẫn sử dụng tính năng Validator
use Respect\Validation\Validator as v;
// Validate the single rule
$number = 123;
v::numericVal()->validate($number); // true
// Validate multiple rules in chain
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true
// Get the first validation failure reason
try {
$usernameValidator->setName('Tên người dùng')->check('alg anet');
} catch (ValidationException $exception) {
echo $exception->getMessage(); // Tên người dùng chỉ có thể chứa chữ cái (a-z) và số (0-9)
}
// Get all validation failure reasons
try {
$usernameValidator->setName('Tên người dùng')->assert('alg anet');
} catch (ValidationException $exception) {
echo $exception->getFullMessage();
// Sẽ in ra
// - Tên người dùng phải tuân theo các quy tắc sau
// - Tên người dùng chỉ có thể chứa chữ cái (a-z) và số (0-9)
// - Tên người dùng không được chứa khoảng trắng
var_export($exception->getMessages());
// Sẽ in ra
// array (
// 'alnum' => 'Tên người dùng chỉ có thể chứa chữ cái (a-z) và số (0-9)',
// 'noWhitespace' => 'Tên người dùng không được chứa khoảng trắng',
// )
}
// Custom error message
try {
$usernameValidator->setName('Tên người dùng')->assert('alg anet');
} catch (ValidationException $exception) {
var_export($exception->getMessages([
'alnum' => 'Tên người dùng chỉ có thể chứa chữ cái và số',
'noWhitespace' => 'Tên người dùng không được có khoảng trắng',
'length' => 'length tuân theo quy tắc, nên thông báo này sẽ không hiển thị'
]);
// Sẽ in ra
// array(
// 'alnum' => 'Tên người dùng chỉ có thể chứa chữ cái và số',
// 'noWhitespace' => 'Tên người dùng không được có khoảng trắng'
// )
}
// Validate objects
$user = new stdClass;
$user->name = 'Alexandre';
$user->birthdate = '1987-07-01';
$userValidator = v::attribute('name', v::stringType()->length(1, 32))
->attribute('birthdate', v::date()->minAge(18));
$userValidator->validate($user); // true
// Validate arrays
$data = [
'parentKey' => [
'field1' => 'value1',
'field2' => 'value2'
'field3' => true,
]
];
v::key(
'parentKey',
v::key('field1', v::stringType())
->key('field2', v::stringType())
->key('field3', v::boolType())
)
->assert($data); // Cũng có thể sử dụng check() hoặc validate()
// Optional validation
v::alpha()->validate(''); // false
v::alpha()->validate(null); // false
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true
// Negative rule
v::not(v::intVal())->validate(10); // false
Sự khác biệt giữa 3 phương thức của Validator: validate()
, check()
, assert()
validate()
trả về kiểu boolean, không ném ra ngoại lệ
check()
ném ra ngoại lệ khi validation thất bại, thông qua $exception->getMessage()
để lấy lý do thất bại đầu tiên
assert()
ném ra ngoại lệ khi validation thất bại, thông qua $exception->getFullMessage()
có thể lấy tất cả lý do thất bại
Danh sách các quy tắc validation thường dùng
Alnum()
chỉ chứa chữ cái và số
Alpha()
chỉ chứa chữ cái
ArrayType()
kiểu mảng
Between(mixed $minimum, mixed $maximum)
kiểm tra giá trị có nằm giữa hai giá trị khác
BoolType()
kiểm tra có phải là kiểu boolean hay không
Contains(mixed $expectedValue)
kiểm tra có chứa giá trị mong muốn hay không
ContainsAny(array $needles)
kiểm tra có chứa ít nhất một giá trị đã được xác định hay không
Digit()
kiểm tra chỉ chứa chữ số
Domain()
kiểm tra có phải là tên miền hợp lệ hay không
Email()
kiểm tra có phải là địa chỉ email hợp lệ hay không
Extension(string $extension)
kiểm tra phần mở rộng của tệp tin
FloatType()
kiểm tra có phải là kiểu số thực hay không
IntType()
kiểm tra có phải là số nguyên hay không
Ip()
kiểm tra có phải là địa chỉ IP hay không
Json()
kiểm tra có phải là dữ liệu JSON hay không
Length(int $min, int $max)
kiểm tra chiều dài có nằm trong khoảng cho trước hay không
LessThan(mixed $compareTo)
kiểm tra chiều dài có nhỏ hơn giá trị cho trước hay không
Lowercase()
kiểm tra có phải là chữ thường hay không
MacAddress()
kiểm tra có phải là địa chỉ MAC hay không
NotEmpty()
kiểm tra có rỗng hay không
NullType()
kiểm tra có phải là giá trị null hay không
Number()
kiểm tra có phải là số hay không
ObjectType()
kiểm tra có phải là đối tượng hay không
StringType()
kiểm tra có phải là kiểu chuỗi hay không
Url()
kiểm tra có phải là URL hay không
Xem thêm danh sách các quy tắc validation tại https://respect-validation.readthedocs.io/en/2.0/list-of-rules/