验证器

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

  1. <?php
  2. namespace app\index\validate;
  3. use think\Validate;
  4. class User extends Validate
  5. {
  6. protected $rule = [
  7. 'name' => 'require|max:25',
  8. 'age' => 'number|between:1,120',
  9. 'email' => 'email',
  10. ];
  11. protected $message = [
  12. 'name.require' => '名称必须',
  13. 'name.max' => '名称最多不能超过25个字符',
  14. 'age.number' => '年龄必须是数字',
  15. 'age.between' => '年龄只能在1-120之间',
  16. 'email' => '邮箱格式错误',
  17. ];
  18. }

使用

  1. $data = [
  2. 'name' => 'thinkphp',
  3. 'email' => 'thinkphp@qq.com',
  4. ];
  5. $validate = new \app\index\validate\User;
  6. if (!$validate->check($data)) {
  7. var_dump($validate->getError());
  8. }

验证器 workerman/validation

说明

项目为 https://github.com/Respect/Validation 的汉化版本

项目地址

https://github.com/walkor/validation

安装

  1. composer require workerman/validation

快速开始

  1. <?php
  2. namespace app\controller;
  3. use support\Request;
  4. use Respect\Validation\Validator as v;
  5. use support\Db;
  6. class Index
  7. {
  8. public function index(Request $request)
  9. {
  10. $data = v::input($request->post(), [
  11. 'nickname' => v::length(1, 64)->setName('昵称'),
  12. 'username' => v::alnum()->length(5, 64)->setName('用户名'),
  13. 'password' => v::length(5, 64)->setName('密码')
  14. ]);
  15. Db::table('user')->insert($data);
  16. return json(['code' => 0, 'msg' => 'ok']);
  17. }
  18. }

通过jquery访问

  1. $.ajax({
  2. url : 'http://127.0.0.1:8787',
  3. type : "post",
  4. dataType:'json',
  5. data : {nickname:'汤姆', username:'tom cat', password: '123456'}
  6. });

得到结果:

{"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异常并返回需要的数据,类似下面的例子:

  1. <?php
  2. namespace app\controller;
  3. use support\Request;
  4. use Respect\Validation\Validator as v;
  5. use Respect\Validation\Exceptions\ValidationException;
  6. class Index
  7. {
  8. public function index(Request $request)
  9. {
  10. try {
  11. $data = v::input($request->post(), [
  12. 'username' => v::alnum()->length(5, 64)->setName('用户名'),
  13. 'password' => v::length(5, 64)->setName('密码')
  14. ]);
  15. } catch (ValidationException $e) {
  16. return json(['code' => 500, 'msg' => $e->getMessage()]);
  17. }
  18. return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);
  19. }
  20. }

Validator 功能指南

  1. use Respect\Validation\Validator as v;
  2. // 单个规则验证
  3. $number = 123;
  4. v::numericVal()->validate($number); // true
  5. // 多个规则链式验证
  6. $usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
  7. $usernameValidator->validate('alganet'); // true
  8. // 获得第一个验证失败原因
  9. try {
  10. $usernameValidator->setName('用户名')->check('alg anet');
  11. } catch (ValidationException $exception) {
  12. echo $exception->getMessage(); // 用户名 只能包含字母(a-z)和数字(0-9)
  13. }
  14. // 获得所有验证失败的原因
  15. try {
  16. $usernameValidator->setName('用户名')->assert('alg anet');
  17. } catch (ValidationException $exception) {
  18. echo $exception->getFullMessage();
  19. // 将会打印
  20. // - 用户名 必须符合以下规则
  21. // - 用户名 只能包含字母(a-z)和数字(0-9)
  22. // - 用户名 不能包含空格
  23. var_export($exception->getMessages());
  24. // 将会打印
  25. // array (
  26. // 'alnum' => '用户名 只能包含字母(a-z)和数字(0-9)',
  27. // 'noWhitespace' => '用户名 不能包含空格',
  28. // )
  29. }
  30. // 自定义错误提示信息
  31. try {
  32. $usernameValidator->setName('用户名')->assert('alg anet');
  33. } catch (ValidationException $exception) {
  34. var_export($exception->getMessages([
  35. 'alnum' => '用户名只能包含字母和数字',
  36. 'noWhitespace' => '用户名不能有空格',
  37. 'length' => 'length符合规则,所以这条将不会显示'
  38. ]);
  39. // 将会打印
  40. // array(
  41. // 'alnum' => '用户名只能包含字母和数字',
  42. // 'noWhitespace' => '用户名不能有空格'
  43. // )
  44. }
  45. // 验证对象
  46. $user = new stdClass;
  47. $user->name = 'Alexandre';
  48. $user->birthdate = '1987-07-01';
  49. $userValidator = v::attribute('name', v::stringType()->length(1, 32))
  50. ->attribute('birthdate', v::date()->minAge(18));
  51. $userValidator->validate($user); // true
  52. // 验证数组
  53. $data = [
  54. 'parentKey' => [
  55. 'field1' => 'value1',
  56. 'field2' => 'value2'
  57. 'field3' => true,
  58. ]
  59. ];
  60. v::key(
  61. 'parentKey',
  62. v::key('field1', v::stringType())
  63. ->key('field2', v::stringType())
  64. ->key('field3', v::boolType())
  65. )
  66. ->assert($data); // 也可以用 check() 或 validate()
  67. // 可选验证
  68. v::alpha()->validate(''); // false
  69. v::alpha()->validate(null); // false
  70. v::optional(v::alpha())->validate(''); // true
  71. v::optional(v::alpha())->validate(null); // true
  72. // 否定规则
  73. 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/

更多内容

访问 https://respect-validation.readthedocs.io/en/2.0/