ThinkValidate3.0新特性
流年 · 9个月前
`ThinkValidate`是一个基于PHP的数据验证库,从`ThinkPHP`的核心组件独立维护,以功能和性能著称,提供了更好的开发体验。

`3.0`版本采用PHP`8.0`重构,并同步了最新`ThinkPHP8.1`框架的功能,可以用于其它第三方框架快速进行数据验证(如果使用了ThinkPHP则内置支持)。
## 主要特性
* 基于PHP8和强类型实现
* 内置丰富的验证规则
* 支持验证器类、数组和链式方法定义验证规则
* 支持验证场景和验证分组
* 支持独立数据验证
* 支持枚举验证
* 支持批量验证
* 支持抛出异常
## 安装
使用`composer`安装
```
composer require topthink/think-validate
```
如果你的PHP环境低于`8.0`,会自动安装`2.0`版本。
详细使用可以参考官方的[开发指南](https://doc.thinkphp.cn/@think-validate/default.html)文档,下面简单介绍下新版的一些新特性:
## 方法定义
由于属性定义的局限性,因此如果需要定义一些特殊的验证规则,我们可以改成通过方法定义。
```
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected function rules()
{
return [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
}
}
```
可以在`rules`方法里面返回数组或当前对象,区别主要在于使用返回数组方式,`rule`属性定义的验证规则不再生效。而对象方式的`rules`定义规则会和`rule`属性定义的合并(存在相同的字段则会覆盖)。
```
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected function rules()
{
return $this
->rule('name', 'require|max:25', ['require' => '名称必须', 'max' => '名称最多不能超过25个字符'])
->rule('age', 'number|between:1,120', ['number' => '年龄必须是数字', 'between' => '年龄只能在1-120之间'])
->rule('email', 'email', '邮箱格式错误');
}
}
```
## 规则别名
可以给一些常见的规则定义别名,方便复用。
```
<?php
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $alias = [
'name' => 'require|alphaNum|max:25',
'age' => 'number|between:1,120',
];
protected $rule = [
// 使用规则别名
'name' => 'name',
'age' => 'age',
'email' => 'email',
];
}
```
规则别名对应的规则可以是任何有效的规则定义,包括字符串和数组方式。
## 数组验证
支持对数组元素进行验证
```
<?php
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
// info是一个索引数组
'info.email' => 'email',
'info.score' => 'number',
];
}
```
支持多维数组验证
```
<?php
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
// info是一个二维数组
'info.*.email' => 'email',
'info.*.score' => 'number',
];
}
```
## 验证集
使用验证集的方式定义验证规则,可以简化数组验证规则定义。例如,
```
namespace app\validate;
use think\Validate;
class Good extends Validate
{
protected function rules()
{
return $this->ruleSet('pay', [
'title' => 'require',
'price' => 'require|integer',
]);
}
}
```
相当于下面的定义
```
namespace app\validate;
use think\Validate;
class Good extends Validate
{
protected function rules()
{
return [
'pay.*.title' => 'require',
'pay.*.price' => 'require|integer',
];
}
}
```
并且可以支持嵌套定义,例如:
```
namespace app\validate;
use think\Validate;
class Good extends Validate
{
protected function rules()
{
return $this->ruleSet('pay', [
'total' => 'require|integer',
'item.*' => rules([
'title' => 'require',
'price' => 'require|integer',
]),
]);
}
}
```
## 验证分组
可以给验证规则定义分组,每个分组的规则彼此独立,但可以共用别名规则和错误信息,相当于把多个验证器类合并成一个验证类。
```
namespace app\validate;
use think\Validate;
class Project extends Validate
{
protected $message = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'age.number' => '年龄必须是数字',
'age.between' => '年龄只能在1-120之间',
'email' => '邮箱格式错误',
];
protected $group = [
'user' => [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
],
];
}
```
然后可以在验证方法中指定验证的分组
```
$data = [
'name' => 'thinkphp',
'age' => 10,
'email' => 'thinkphp@qq.com',
];
try {
validate(app\validate\Project::class)
->check($data, 'user');
} catch (ValidateException $e) {
// 验证失败 输出错误信息
dump($e->getError());
}
```
可以单独为某个分组定义方法(方法的命名规范是`rules`+分组名),并且通过数组或方法设置分组规则,例如:
```
namespace app\validate;
use think\Validate;
class Project 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' => '邮箱格式错误',
];
// 分组规则定义
public function rulesUser()
{
return [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
}
}
```
可以使用方法定义分组,这个时候必须传入一个`validate`参数,该参数是一个`Validate`对象。
```
namespace app\validate;
use think\Validate;
class Project 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' => '邮箱格式错误',
];
// 分组规则定义
public function rulesUser(Validate $validate)
{
return $validate->rule([
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
]);
}
}
```
验证分组还可以配合场景或者`only`方法一起使用,更加灵活。
更多使用可以参考[开发指南](https://doc.thinkphp.cn/@think-validate/default.html)。
<br>
资讯来源:https://doc.thinkphp.cn/@wiki/think-validate-update-3-0.html
推荐资讯
-
ThinkPHP的AI战略——从框架到AI引擎的进化
2025年09月18日
-
ThinkWiki VIBE模式上线——开启AI写作时代
2025年09月17日
-
使用 ThinkAI 快速无门槛接入 Claude Code
2025年08月08日
-
ThinkORM4流式查询最佳实践指南
2025年08月04日
-
ThinkPHP8.1.3版本发布——路由和日志优化
2025年07月15日
最新资讯
-
ThinkPHP的AI战略——从框架到AI引擎的进化
2025年09月18日
-
ThinkWiki VIBE模式上线——开启AI写作时代
2025年09月17日
-
使用 ThinkAI 快速无门槛接入 Claude Code
2025年08月08日
-
ThinkORM4流式查询最佳实践指南
2025年08月04日
-
ThinkPHP8.1.3版本发布——路由和日志优化
2025年07月15日