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ức Validate::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/

Thêm thông tin

Truy cập https://respect-validation.readthedocs.io/en/2.0/