💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 验证规则 验证规则的定义通常有两种方式,如果你使用了验证器的话,通常通过`rule`属性定义验证规则,而如果使用的是独立验证的话,则是通过`rule`方法进行定义。 ## 属性定义 属性定义方式仅限于验证器,通常类似于下面的方式: ``` <?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', ]; } ``` > 系统内置了一些常用的验证规则可以满足大部分的验证需求,具体每个规则的含义参考内置规则一节。 因为一个字段可以使用多个验证规则(如上面的`age`字段定义了`number`和`between`两个验证规则),在一些特殊的情况下,为了避免混淆可以在`rule`属性中使用数组定义规则。 ``` <?php namespace app\index\validate; use think\Validate; class User extends Validate { protected $rule = [ 'name' => ['require', 'max' => 25, 'regex' => '/^[\w|\d]\w+/'], 'age' => ['number', 'between' => '1,120'], 'email' => 'email', ]; } ``` ## 方法定义 如果使用的是独立验证(即手动调用验证类进行验证)方式的话,通常使用`rule`方法进行验证规则的设置,举例说明如下。 ``` $validate = new \think\Validate; $validate->rule('age', 'number|between:1,120') ->rule([ 'name' => 'require|max:25', 'email' => 'email' ]); $data = [ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com' ]; if (!$validate->check($data)) { dump($validate->getError()); } ``` > `rule`方法传入数组表示批量设置规则。 `rule`方法还可以支持使用对象化的规则定义,这是5.1版本新增的特性。 我们把上面的验证代码改为 ``` use think\validate\ValidateRule as Rule; $validate = new \think\Validate; $validate->rule('age', Rule::isNumber()->between([1,120])) ->rule([ 'name' => Rule::isRequire()->max(25), 'email' => Rule::isEmail(), ]); $data = [ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com' ]; if (!$validate->check($data)) { dump($validate->getError()); } ``` 可以对某个字段使用闭包验证,例如: ``` $validate = new \think\Validate; $validate->rule([ 'name' => function($value) { return 'thinkphp' == strtolower($value) ? true : false; }, ]); ``` 闭包支持传入两个参数,第一个参数是当前字段的值(必须),第二个参数是所有数据(可选)。 > 如果使用了闭包进行验证,则不再支持对该字段使用多个验证规则。 闭包函数如果返回true则表示验证通过,返回false表示验证失败并使用系统的错误信息,如果返回字符串,则表示验证失败并且以返回值作为错误提示信息。 ``` $validate = new \think\Validate; $validate->rule([ 'name' => function($value) { return 'thinkphp' == strtolower($value) ? true : '用户名错误'; }, ]); ``` > 属性方式定义验证规则不支持使用对象化规则定义和闭包定义