验证器
composer有很多验证器可以直接在使用,例如:
top-think/think-validate
respect/validation
验证器 top-think/think-validate
说明
ThinkPHP官方验证器
项目地址
https://github.com/top-think/think-validate
安装
composer require topthink/think-validate
快速开始
新建 app/index/validate/User.php
<?phpnamespace 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' => '名称必须','name.max' => '名称最多不能超过25个字符','age.number' => '年龄必须是数字','age.between' => '年龄只能在1-120之间','email' => '邮箱格式错误',];}
使用
$data = ['name' => 'thinkphp','email' => 'thinkphp@qq.com',];$validate = new \app\index\validate\User;if (!$validate->check($data)) {var_dump($validate->getError());}
验证器 workerman/validation
说明
项目为 https://github.com/Respect/Validation 的汉化版本
项目地址
https://github.com/walkor/validation
安装
composer require workerman/validation
快速开始
<?phpnamespace app\controller;use support\Request;use Respect\Validation\Validator as v;use support\Db;class Index{public function index(Request $request){$data = v::input($request->post(), ['nickname' => v::length(1, 64)->setName('昵称'),'username' => v::alnum()->length(5, 64)->setName('用户名'),'password' => v::length(5, 64)->setName('密码')]);Db::table('user')->insert($data);return json(['code' => 0, 'msg' => 'ok']);}}
通过jquery访问
$.ajax({url : 'http://127.0.0.1:8787',type : "post",dataType:'json',data : {nickname:'汤姆', username:'tom cat', password: '123456'}});
得到结果:
{"code":500,"msg":"用户名 只能包含字母(a-z)和数字(0-9)"}
说明:
v::input(array $input, array $rules) 用来验证并收集数据,如果数据验证失败,则抛出Respect\Validation\Exceptions\ValidationException异常,验证成功则将返回验证后的数据(数组)。
如果业务代码未捕获验证异常,则webman框架将自动捕获并根据HTTP请求头选择返回json数据(类似{"code":500, "msg":"xxx"})或者普通的异常页面。如返回格式不符合业务需求,开发者可自行捕获ValidationException异常并返回需要的数据,类似下面的例子:
<?phpnamespace app\controller;use support\Request;use Respect\Validation\Validator as v;use Respect\Validation\Exceptions\ValidationException;class Index{public function index(Request $request){try {$data = v::input($request->post(), ['username' => v::alnum()->length(5, 64)->setName('用户名'),'password' => v::length(5, 64)->setName('密码')]);} catch (ValidationException $e) {return json(['code' => 500, 'msg' => $e->getMessage()]);}return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);}}
Validator 功能指南
use Respect\Validation\Validator as v;// 单个规则验证$number = 123;v::numericVal()->validate($number); // true// 多个规则链式验证$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);$usernameValidator->validate('alganet'); // true// 获得第一个验证失败原因try {$usernameValidator->setName('用户名')->check('alg anet');} catch (ValidationException $exception) {echo $exception->getMessage(); // 用户名 只能包含字母(a-z)和数字(0-9)}// 获得所有验证失败的原因try {$usernameValidator->setName('用户名')->assert('alg anet');} catch (ValidationException $exception) {echo $exception->getFullMessage();// 将会打印// - 用户名 必须符合以下规则// - 用户名 只能包含字母(a-z)和数字(0-9)// - 用户名 不能包含空格var_export($exception->getMessages());// 将会打印// array (// 'alnum' => '用户名 只能包含字母(a-z)和数字(0-9)',// 'noWhitespace' => '用户名 不能包含空格',// )}// 自定义错误提示信息try {$usernameValidator->setName('用户名')->assert('alg anet');} catch (ValidationException $exception) {var_export($exception->getMessages(['alnum' => '用户名只能包含字母和数字','noWhitespace' => '用户名不能有空格','length' => 'length符合规则,所以这条将不会显示']);// 将会打印// array(// 'alnum' => '用户名只能包含字母和数字',// 'noWhitespace' => '用户名不能有空格'// )}// 验证对象$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// 验证数组$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); // 也可以用 check() 或 validate()// 可选验证v::alpha()->validate(''); // falsev::alpha()->validate(null); // falsev::optional(v::alpha())->validate(''); // truev::optional(v::alpha())->validate(null); // true// 否定规则v::not(v::intVal())->validate(10); // false
Validator 三个方法 validate() check() assert() 区别
validate()返回布尔型,不会抛出异常
check()验证失败时抛出异常,通过$exception->getMessage()第一条验证失败的原因
assert()验证失败时抛出异常,通过$exception->getFullMessage()可以获得所有验证失败的原因
常用验证规则列表
Alnum() 只包含字母和数字
Alpha() 只包含字母
ArrayType() 数组类型
Between(mixed $minimum, mixed $maximum) 验证输入是否在其他两个值之间。
BoolType() 验证是否是布尔型
Contains(mixed $expectedValue) 验证输入是否包含某些值
ContainsAny(array $needles) 验证输入是否至少包含一个定义的值
Digit() 验证输入是否只包含数字
Domain() 验证是否是合法的域名
Email() 验证是否是合法的邮件地址
Extension(string $extension) 验证后缀名
FloatType() 验证是否是浮点型
IntType() 验证是否是整数
Ip() 验证是否是ip地址
Json() 验证是否是json数据
Length(int $min, int $max) 验证长度是否在给定区间
LessThan(mixed $compareTo) 验证长度是否小于给定值
Lowercase() 验证是否是小写字母
MacAddress() 验证是否是mac地址
NotEmpty() 验证是否为空
NullType() 验证是否为null
Number() 验证是否为数字
ObjectType() 验证是否为对象
StringType() 验证是否为字符串类型
Url() 验证是否为url
更多验证规则参见 https://respect-validation.readthedocs.io/en/2.0/list-of-rules/
