验证器验证
1、ThinkPHP5.1推荐使用验证器进行数据验证(也支持使用\think\Validate类进行独立验证)
2、验证器使用的是Validate类中的rule属性
3、验证器是一个类,定义验证器时要继承Validate类
4、验证器可以创建在应用application目录下的任何一个可以访问的目录下,这个访问不是指外部的url访问,只需要指定正确的命名空间
5、验证器其实是完成框架的think\Validate类中的属性protected $rule=[] 的初始化
6、在控制器中可以直接实例化调用check()完成验证,还可以创建一个自定义的静态代理,来统一验证方法的调用方式
定义验证器
<?php
//用户信息表的字段验证器
namespace app\validate;
use think\Validate;
class User extends Validate
{
//推荐格式,验证规则,可参照Validate.php
protected $rule = [
'name' => [
'require' => 'require',
'min' => 5,
'max' => 20
],
'email' => [
'require' => 'require',
'email' => 'email'
],
'password' => [
'require' => 'require',
'min' => 5,
'max' => 12,
'alphaNum' => 'alphaDash' //密码必须是字母或数字
],
'mobile' => [
'require' => 'require',
'mobile' => 'mobile'
]
];
//错误提示信息,若不定义使用默认信息
protected $message = [
'name' => [
'require' => '用户名不能为空',
'min' => '用户名过短',
'max' => '用户名过长'
],
'email' => [
'require' => '邮箱不能为空',
'email' => '不符合邮箱格式'
],
'password' => [
'require' => '密码不能为空',
'min' => '最短5位',
'max' => '最长12位',
'alphaNum' => '密码必须是字母或数字'
],
'mobile' => [
'require' => '手机号不能为空',
'mobile' => '不符合手机格式'
]
];
}
数据验证
<?php
namespace app\index\controller;
use think\Controller;
use app\Validate\User; //用户自定义的验证器
class Demo9 extends Controller
{
//1、验证器使用的是Validate类中的rule属性
public function test1()
{
//要验证的数据
$data = [
'name' => 'zmz',
'email' => 'zmz@qq.com',
'password' => 'zmz123456',
'mobile' => '15065845666'
];
//2、数据验证
$validate = new User;
if (!$validate->check($data)) {
//验证失败,输出提示信息
return $validate->getError();
}
return '验证通过';
}
}
批量验证
默认情况下,一旦有某个数据的验证规则不符合,就会停止后续数据及规则的验证,如果希望批量进行验证,可以设置:
class Index extends Controller
{
// 是否批量验证
protected $batchValidate = true;
public function index()
{
$result = $this->validate(
[
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
],
'app\index\validate\User');
if (true !== $result) {
// 验证失败 输出错误信息
dump($result);
}
}
}
在非控制器的地方如果需要执行批量验证,可以在验证的时候添加是否批量的方法batch()
namespace app\common\service;
use app\common\validate\User as UserValidate;
class Test
{
public function validateTest($data)
{
$validata = new UserValidate;
$result = $validate->batch()->check($data);
if ($result !== true) {
dump($result);
}
}
}
静态代理
实现验证器的静态代理
<?php
namespace app\faced;
use think\Facade;
class User extends Facade
{
protected static function getFacadeClass()
{
return 'app\validate\User';
}
}
验证数据
<?php
namespace app\index\controller;
use think\Controller;
use app\faced\User;
class Demo9 extends Controller
{
//1、验证器使用的是Validate类中的rule属性
public function test1()
{
//要验证的数据
$data = [
'name' => 'zmz123',
'email' => 'zmz@qq.com',
'password' => 'zmz123456',
'mobile' => '15065845666'
];
//使用当前验证器的静态代理
if (!User::check($data)) {
//验证失败,输出提示信息
return User::getError();
}
return '验证通过';
}
}
控制器验证
//调用控制器中的validate方法进行验证,也需要使用用户自定义的验证器
public function test2()
{
/**
* $this->validate($data ,$validate,$message)
* $data要验证的数据,$validate验证规则,必须
* $message 提示信息,为空时使用默认信息,可选
* 返回验证结果
*/
//要验证的数据
$data = [
'name' => 'zmz123',
'email' => 'zmz@qq.com',
'password' => 'zmz123456',
'mobile' => '15065845666'
];
//验证规则
$validate = 'app\validate\User';
//数据验证
$res = $this->validate($data, $validate);
if ($res !== true) {
return $res;
}
return '验证通过';
}
独立验证
独立验证的含义:
任何时候,都可以直接使用think\Validate类而不需要定义验证器类进行独立的验证操作
推荐格式:
<?php
namespace app\index\controller;
use think\Controller;
use think\facade\Validate;
class Demo9 extends Controller
{
public function test()
{
//验证规则
$rule = [
'name' => [
'require' => 'require',
'min' => 5,
'max' => 20
],
'email' => [
'require' => 'require',
'email' => 'email'
]
];
//提示信息
$msg = [
'name' => [
'require' => '用户名不能为空',
'min' => '用户名过短',
'max' => '用户名过长'
],
'email' => [
'require' => '邮箱不能为空',
'email' => '不符合邮箱格式'
]
];
//数据
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
//数据验证
$validate = Validate::make($rule, $msg);
$result = $validate->check($data);
if (!$result) {
return $validate->getError();
}
return '验证通过';
}
}
注: 与之前说的验证器验证其实本质一样,只是不需要定义验证器,把所有代码放在了一块