验证器

workerman/validation

  • 说明

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

  • 项目地址

    https://github.com/walkor/validation

  • 安装

    composer require workerman/validation
  • 快速开始

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

    <?php
    namespace 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(''); // false 
    v::alpha()->validate(null); // false 
    v::optional(v::alpha())->validate(''); // true
    v::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/

  • 更多内容

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