验证器
ThinkPHP推荐使用验证器,可以在控制器中使用validate
助手函数(或者封装验证方法)进行验证
验证器定义
app\validate\User.php
<?php
namespace app\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' => '邮箱格式错误',
];
}
数据验证
app\controller\Index.php
<?php
namespace app\controller;
use app\validate\User;
use think\exception\ValidateException;
class Index
{
public function index()
{
try {
validate(User::class)->check([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
]);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
dump($e->getError());
}
}
}
批量验证
默认情况下,一旦有某个数据的验证规则不符合,就会停止后续数据及规则的验证,如果希望批量进行验证,可以设置
app\controller\Index.php
<?php
namespace app\controller;
use app\validate\User;
use think\exception\ValidateException;
class Index
{
public function index()
{
try {
$result = validate(User::class)->batch(true)->check([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
]);
if (true !== $result) {
// 验证失败 输出错误信息
dump($result);
}
} catch (ValidateException $e) {
// 验证失败 输出错误信息
dump($e->getError());
}
}
}
验证场景
验证器支持定义场景,并且验证不同场景的数据
app\index\validate\User.php
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
/**
* 定义验证规则
* 格式:'字段名' => ['规则1','规则2'...]
*
* @var array
*/
protected $rule = [
//email字段,必须是必填、唯一的对照admin表
'username' => 'require|unique:admin',
'password' => 'require', //必填
'salt' => 'require', //必填
'nickname' => 'require', //必填
'state' => 'number|in:0,1', //给字段设置范围
];
/**
* 定义错误信息
* 格式:'字段名.规则名' => '错误信息'
*
* @var array
*/
protected $message = [
'username.require' => '用户名必填',
'username.unique' => '用户名已存在,请重新输入',
'password.require' => '密码必填',
'nickname.require' => '昵称必填',
'salt.require' => '密码盐必填',
'state.number' => '账号状态必须是个数字',
];
/**
* 定义验证场景
* 格式:'场景' => ['字段名1','字段名2']
*/
protected $scene = [
'edit' => ['username','nickname'],
];
}
在控制器里面调用User
验证器
app\index\controller\Index.php
<?php
declare(strict_types=1);
namespace app\index\controller;
use app\BaseController;
use app\index\model\User;
use think\exception\ValidateException;
class Index extends BaseController
{
public function index()
{
// 更新数据
$data = [
'username' => 'aaa',
'nickname' => 'ddd'
];
try {
// 调用User验证器验证数据
$this->validate($data,'app\index\validate\User.edit');
// 更新数据表
$user = User::where(['id' => 3])->save($data);
// 判断是否更新失败
if($user == FALSE)
{
// 定义异常错误信息
throw new \Exception('更新失败');
}else{
dump('更新成功');
}
} catch (ValidateException $e) {
// 验证失败 输出错误信息
dump($e->getError());
} catch (\Exception $error){
// 输出错误信息
dump($error->getMessage());
}
}
}
内置规则
系统内置了一些常用的验证规则,可以完成大部分场景的验证需求
// 验证某个字段必须,例如:
'name'=>'require'
// 验证某个字段的值是否为数字(采用filter_var验证),例如:
'num'=>'number'
// 验证某个字段的值是否为浮点数字(采用filter_var验证),例如:
'num'=>'float'
// 验证某个字段的值是否为布尔值(采用filter_var验证),例如:
'num'=>'boolean'
// 验证某个字段的值是否为email地址(采用filter_var验证),例如:
'email'=>'email'
// 验证某个字段的值是否为数组,例如:
'info'=>'array'
// 验证某个字段是否为为 yes, on, 或是 1。这在确认"服务条款"是否同意时很有用,例如:
'accept'=>'accepted'
// 验证值是否为有效的日期,例如:
'date'=>'date'
// 验证某个字段的值是否为字母,例如:
'name'=>'alpha'
// 验证某个字段的值是否为字母和数字,例如:
'name'=>'alphaNum'
// 验证某个字段的值是否为字母和数字,下划线_及破折号-,例如:
'name'=>'alphaDash'
// 验证某个字段的值只能是汉字,例如:
'name'=>'chs'
// 验证某个字段的值只能是汉字、字母,例如:
'name'=>'chsAlpha'
// 验证某个字段的值只能是汉字、字母和数字,例如:
'name'=>'chsAlphaNum'
// 验证某个字段的值只能是汉字、字母、数字和下划线_及破折号-,例如:
'name'=>'chsDash'
// 验证某个字段的值是否为有效的域名或者IP,例如:
'host'=>'activeUrl'
// 验证某个字段的值是否为有效的URL地址(采用filter_var验证),例如:
'url'=>'url'
// 验证某个字段的值是否为有效的IP地址(采用filter_var验证),例如:
'ip'=>'ip'
// 验证某个字段的值是否为指定格式的日期,例如:
'create_time'=>'dateFormat:y-m-d'
// 验证某个字段的值是否在某个范围,例如:
'num'=>'in:1,2,3'
// 验证某个字段的值不在某个范围,例如:
'num'=>'notIn:1,2,3'
// 验证某个字段的值是否在某个区间,例如:
'num'=>'between:1,10'
// 验证某个字段的值不在某个范围,例如:
'num'=>'notBetween:1,10'
// 验证某个字段的值的长度是否在某个范围,例如:
'name'=>'length:4,25'
// 验证某个字段的值的最大长度,例如:
'name'=>'max:25'
// 验证某个字段的值的最小长度,例如:
'name'=>'min:5'
// 验证某个字段的值是否在某个日期之后,例如:
'begin_time' => 'after:2016-3-18',
// 验证某个字段的值是否在某个日期之前,例如:
'end_time' => 'before:2016-10-01',