在ThinkPHP中如何实现提交数据的自动验证?
自动验证就是在提交数据的时候系统会按照指定的规则进行数据的有效性、合理性的验证。
上述提及到规则,系统默认是没有,如果需要使用自动验证,规则需要我们自己去定义。
在前端中javascript的验证叫前端验证,在ThinkPHP中也存在验证机制,这样的验证称之叫做后端验证。
自动验证语法:没有语法,由数据对象创建方法create方法去实现自动验证,那我们需要写的就是验证规则。
model.class.php的底层代码:
// 数据自动验证
if(!$this->autoValidation($data,$type)) return false;
因为在create方法中执行了自动验证的处理,如果需使用自动验证,则必须要用数据对象创建方法进行接收数据。
那如何去定义所谓“规则”呢?
在父类模型中存在一个成员属性,叫做_validate,这个属性是保存验证规则的。由于不能在父类模型中直接更改属性,所以可以把这个属性复制到子类(自定义模型)中去定义规则。
<?php
//创建模型
//命名空间
namespace Admin\Model;
//引用父类模型
use Think\Model;
//声明模型并继承父类
class DeptModel extends Model{
protected $_validate = array(); // 自动验证定义
}
规则编写(参考手册):
必选参数:
验证字段:表单中每一个表单项的name值;
验证规则:就是针对验证字段的要求格式的限制,常见规则有require 字段必须、email 邮箱、url URL地址、currency 货币、number 数字。
错误提示:在验证不合理的时候给用户提示信息。
可选参数:
验证条件:0表示字段存在就验证(默认),1表示必须验证,2表示字段不为空的时候验证。
附加规则:结合验证规则,两者配合起来使用。具体支持的方法,可以参考手册“自动验证”。
验证时间:1表示新增数据的时候验证,2表示编辑的时候验证,3表示全部情况下都验证(默认)。
案例:针对部门添加功能,使用自动验证来验证字段的合法性。
说明:如果在自动验证中使用函数(function)来验证字段的合法性,则第二个参数要求是函数名(函数名要是函数是php内置的函数或者自己定义的函数《自定义函数可以是函数库中声明的也可以在当前模型中去定义》)。
<?php
//创建模型
//命名空间
namespace Admin\Model;
//引用父类模型
use Think\Model;
//声明模型并继承父类
class DeptModel extends Model{
protected $_validate = array(
// 自动验证定义
//针对部门名称的规则,必填,不能重复
array('name','require','部门名称不能为空!'),
array('name','','部门已经存在!',0,'unique'),
//排序字段的验证,数字
//array('sort','number','排序必须是数字!'),
//使用函数的方式来验证排序是否是数字
array('sort','is_number','排序必须是数字!',0,'function'),
);
}
注意:因为规则是定义在自定义模型中,所以模型在实例化的时候必须需要实例化自定义模型。
自动验证失败,则create方法返回false,如果验证成功,则返回正常的数组。
输出用户提示信息:
$model -> getError();
//判断验证结果
if(!$data){
//提示用户验证失败
//echo $model -> getError();die;
$this -> error($model -> getError());exit;
}
$result = $model -> add();
批量验证:
需要配置一个成员属性:patchValidate设置成true,则表示开启批量验证。
class DeptModel extends Model{
//开启批量验证
protected $patchValidate = true;
完整代码:
public function add(){
if(IS_POST){
//处理表单提交
//$post = I('post.');
//添加数据
//实例化模型
$model = D('Dept');
$data = $model -> create();//不传递参数则接受post数据
//判断验证结果
if(!$data){
//提示用户验证失败
//echo $model -> getError();die;
$this -> error($model -> getError());exit;
}
$result = $model -> add();
//判断返回值
if($result){
//添加成功
//成功
$this -> success('添加成功',U('showList'),5);
}else{
//失败
$this -> error('添加失败');
}
}else{
//实例化模型
$model = M('Dept');
//查询操作
$data = $model -> where('pid = 0') -> select();
//变量分配
$this -> assign('data',$data);
//展示模板
$this -> display();
}
}