今天,主要学习的是ThinkPhp51的验证,主要有一下集中验证方式:
. 验证器
验证器实际上是类,通常在app下与index平级来新建文件夹
validate
,然后下面新建staff.php
,这里不是强制与控制器下面的操作方法同名,而是约定,方便。staff类继承自控制器下validata类 然后里面有几个属性可以复写.
.$rule
可以自定义规则
.$message
可以定义错误提示信息
.$scene
可以定义验证场景 (可选)
namespace app\index\validate;
use think\Validate;
class Staff extends Validate
{
//字段验证规则
protected $rule = [
'name' => 'require|chsAlpha|length:3, 20',
'sex' => 'require|number|in:0, 1',
'age' => 'require|number|between:18, 59',
'email' => 'require|email'
];
//验证错误提示
protected $message = [
'name.require' => '员工姓名不能为空',
'name.chsAlpha' => '姓名必须是字母或者汉字',
'name.length' => '姓名长度必须在3到20个字符之间',
'sex.require' => '性别不能为空',
'sex.number' => '性别必须是整数',
'sex.in' => '性别必须是0或者1',
'age.require' => '年龄不能为空',
'age.number' => '年龄必须是整数',
'age.between' => '年龄必须是18到60之间',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确'
];
//验证场景(可选)
protected $scene = [
'add' => ['name', 'sex', 'age', 'email'],
'edit' => ['name', 'sex']
];
}
新建demo5操作来实现验证器验证,首先导入自定义验证器staff,然后避免重名命名为
StaffValidate
,为了简化操作,直接引入数据,实例化自定义验证器类,用check
方法验证,得到结果,结果为布尔值,通过if判读显示验证结果,其中严重错误信息可以用getError
方法来得到//数据验证1 验证器类
public function demo5(){
//为简化操作 直接给定数据
$data = [
'name' => 'jijiming',
'sex' => 1,
'age' => 50,
'email' => 'admin@164.com'
];
//实例化验证器类
$validate = new StaffValidate();
//验证数据 得到结果
$result = $validate->check($data);
if (!$result) {
halt($validate->getError());
}
return '验证成功';
}
. 独立验证 直接使用框架验证类
- 直接使用框架下的验证器类,导入他, 用
make
方法实例化框架内置验证类,然后同上进行验证,显示验证结果。
//数据验证2 独立验证 直接调用框架验证类 不用创建验证器类public function demo6(){
//验证规则
$rule = [
'name' => 'require|chsAlpha|length:3, 20',
'sex' => 'require|number|in:0, 1',
'age' => 'require|number|between:18, 59',
'email' => 'require|email'
];
//验证错误提示
$message = [
'name.require' => '员工姓名不能为空',
'name.chsAlpha' => '姓名必须是字母或者汉字',
'name.length' => '姓名长度必须在3到20个字符之间',
'sex.require' => '性别不能为空',
'sex.number' => '性别必须是整数',
'sex.in' => '性别必须是0或者1',
'age.require' => '年龄不能为空',
'age.number' => '年龄必须是整数',
'age.between' => '年龄必须是18到60之间',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确'
];
//用make方法实例化框架内置验证器类
$validate = Validate::make($rule, $message);
//获取数据
$data = [
'name' => 'jijiming',
'sex' => 1,
'age' => 50,
'email' => 'admin@164.com'
];
//验证数据得到结果
$result = $validate->check($data);
if (!$result) {
halt($validate->getError());
}
return '验证成功';
}
. 独立验证的链式调用方法
- 这里用
new
直接实例化验证类,然后通过链式调用方法rule
message
给定验证条件和验证错误提示,最后同上进行验证和显示。
//数据验证3 独立验证另一种常用语法public function demo7(){
//直接实例化验证类
$validate = new Validate();
//链式调用 给定验证规则 验证错误信息
$validate->rule([
'name' => 'require|chsAlpha|length:3, 20',
'sex' => 'require|number|in:0, 1',
'age' => 'require|number|between:18, 59',
'email' => 'require|email'
])->message([
'name.require' => '员工姓名不能为空',
'name.chsAlpha' => '姓名必须是字母或者汉字',
'name.length' => '姓名长度必须在3到20个字符之间',
'sex.require' => '性别不能为空',
'sex.number' => '性别必须是整数',
'sex.in' => '性别必须是0或者1',
'age.require' => '年龄不能为空',
'age.number' => '年龄必须是整数',
'age.between' => '年龄必须是18到60之间',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确'
]);
//获取数据
$data = [
'name' => 'jijiming',
'sex' => 1,
'age' => 50,
'email' => 'admin@164.com'
];
//验证数据获得结果
$result = $validate->check($data);
if (!$result) {
halt($validate->getError());
}
return '验证成功';
}
. 表单验证 令牌提交验证
- 新建
demo8
渲染表单前端页面,相应建好demo8.html
,讲表单里的数据提交给demo9
处理。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>用户登录</h3>
<form action="{:url('demo9')}" method="post">
<p>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email">
</p>
<p>
<label for="password">密码:</label>
<input type="password" name="password" id="password">
</p>
<!--隐藏域 把令牌传递过去-->
<!--<input type="hidden" name="__token__" value='{:token()}'>-->
<input type="hidden" name="__token__" value="{$Request.token}">
<p>
<button>登陆</button>
</p>
</form>
</body>
</html>
public function demo8(){
return $this->fetch();
}
//用令牌验证表单
public function demo9(){
//获取数据
$data = Request::param();
//实例化内置验证类
$validate = Validate::make();
//设定规则
$result = $validate->rule('email|邮箱', 'require|email')
->rule('password|密码', 'require')
->check($data);
if (!$result){
$this->error($validate->getError());
}
$this->success('验证通过', 'admin');
}
. 其实在controller基类下面有validata方法直接操作
//其实在控制器基类controller中有验证方法validate
public function demo10(){
//获取数据
$data = Request::param();
//获取规则
$rule = [
'email|邮箱' => 'require|email',
'password|密码' => 'require'
];
//验证结果
//如果验证成功返回布尔值
//如果验证失败返回错误信息
$result = $this->validate($data, $rule);
if ($result === true) {
$this->success('验证通过', 'admin');
} else {
$this->error($result);
}
}
//验证通过 后台
public function admin() {
return $this->display('<h1>管理后台</h1>');
}
总结
今天的课程还是相对简单,需要注意自定义验证器类 内置验证类 链式调用 以及表单验证的具体方法,还有在html中{:url('demo9')}
可以指向调用页面路径。
<!--隐藏域 把令牌传递过去-->
<!--<input type="hidden" name="__token__" value='{:token()}'>-->
<input type="hidden" name="__token__" value="{$Request.token}">