Trình xác thực
composer có nhiều trình xác thực có thể sử dụng trực tiếp, chẳng hạn như:
top-think/think-validate
respect/validation
Trình xác thực top-think/think-validate
Mô tả
Trình xác thực 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 chỉ được từ 1-120',
'email' => 'Định dạng email không hợp lệ',
];
}
Sử dụng
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$validate = new \app\index\validate\User;
if (!$validate->check($data)) {
var_dump($validate->getError());
}
Chú ý
webman không hỗ trợ phương thứcValidate::rule()
của think-validate
Trình xác thực workerman/validation
Mô tả
Dự án là phiên bản dịch 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('biệt danh'),
'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 qua jquery
$.ajax({
url : 'http://127.0.0.1:8787',
type : "post",
dataType:'json',
data : {nickname:'汤姆', username:'tom cat', password: '123456'}
});
Kết quả nhận được:
{"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 thực và thu thập dữ liệu, nếu việc xác thực dữ liệu thất bại, sẽ ném ra ngoại lệ Respect\Validation\Exceptions\ValidationException
, nếu xác thực thành công, nó sẽ trả về dữ liệu đã được xác thực (mảng).
Nếu mã nghiệp vụ không bắt được ngoại lệ xác thực, framework webman sẽ tự động bắt và chọn trả về dữ liệu json dựa trên tiêu đề HTTP (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 nghiệp vụ, nhà phát triển có thể tự bắt ngoại lệ ValidationException
và trả về dữ liệu cần thiết, giống như ví dụ bên dưới:
<?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 chức năng Validator
use Respect\Validation\Validator as v;
// Xác thực quy tắc đơn
$number = 123;
v::numericVal()->validate($number); // true
// Xác thực chuỗi nhiều quy tắc
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true
// Lấy nguyên nhân đầu tiên của việc xác thực không thành công
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)
}
// Lấy tất cả các nguyên nhân của việc xác thực không thành công
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',
// )
}
// Tùy chỉnh thông báo lỗi
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' => 'Độ dài phù hợp 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'
// )
}
// Xác thực đối tượng
$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
// Xác thực mảng
$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()
// Xác thực tùy chọn
v::alpha()->validate(''); // false
v::alpha()->validate(null); // false
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true
// Quy tắc phủ định
v::not(v::intVal())->validate(10); // false
Sự khác biệt giữa ba phương thức validate()
check()
assert()
validate()
trả về kiểu boolean, sẽ không ném ra ngoại lệ
check()
ném ra ngoại lệ khi xác thực không thành công, thông qua $exception->getMessage()
để lấy nguyên nhân xác thực không thành công đầu tiên
assert()
ném ra ngoại lệ khi xác thực không thành công, thông qua $exception->getFullMessage()
có thể nhận được tất cả các nguyên nhân xác thực không thành công
Danh sách quy tắc xác thực thông dụng
Alnum()
chỉ bao gồm chữ cái và số
Alpha()
chỉ bao gồm chữ cái
ArrayType()
kiểu mảng
Between(mixed $minimum, mixed $maximum)
xác thực đầu vào có nằm trong hai giá trị khác không.
BoolType()
xác thực có phải là kiểu boolean không
Contains(mixed $expectedValue)
xác thực đầu vào có chứa một số giá trị nhất định không
ContainsAny(array $needles)
xác thực đầu vào có ít nhất một giá trị được định nghĩa không
Digit()
xác thực đầu vào chỉ bao gồm số
Domain()
xác thực có phải là tên miền hợp pháp không
Email()
xác thực có phải là địa chỉ email hợp pháp không
Extension(string $extension)
xác thực phần mở rộng
FloatType()
xác thực có phải là kiểu số thực không
IntType()
xác thực có phải là số nguyên không
Ip()
xác thực có phải là địa chỉ ip không
Json()
xác thực có phải là dữ liệu json không
Length(int $min, int $max)
xác thực chiều dài có trong khoảng cho trước không
LessThan(mixed $compareTo)
xác thực chiều dài có nhỏ hơn giá trị cho trước không
Lowercase()
xác thực có phải là chữ hoa không
MacAddress()
xác thực có phải là địa chỉ mac không
NotEmpty()
xác thực có rỗng không
NullType()
xác thực có phải là null không
Number()
xác thực có phải là số không
ObjectType()
xác thực có phải là đối tượng không
StringType()
xác thực có phải là kiểu chuỗi không
Url()
xác thực có phải là url không
Xem thêm quy tắc xác thực tại https://respect-validation.readthedocs.io/en/2.0/list-of-rules/