表单验证
框架提供了一套完整的表单验证解决方案,适用于绝大多数场景。
表单验证支持所有类型的验证以及自定义方法
简单示例:namespaceapp\form;
usebiny\lib\Form;
/**
* @property \app\service\testService $testService
* 自定义一个表单验证类型类 继承Form
*/
classtestFormextendsForm
{
// 定义表单参数,类型及默认值(可不写,默认null)
protected$_rules=[
// id必须为整型, 默认10
'id'=>[self::typeInt,10],
// name必须非空(包括null, 空字符串)
'name'=>[self::typeNonEmpty],
// 自定义验证方法(valid_testCmp)
'status'=>['testCmp']
];
// 自定义验证方法
publicfunctionvalid_testCmp()
{
// 和Action一样可以调用Service和DAO作为私有方法
if($this->testService->checkStatus($this->status)){
// 验证通过
return$this->correct();
}else{
// 验证失败,参数可以通过getError方法获取
return$this->error('非法类型');
}
}
}
定义完验证类,然后就可以在Action中使用了,可以通过getForm方法加载表单// 加载testForm
$form=$this->getForm('test');
// 验证表单字段,true/false
if(!$form->check()){
// 获取错误信息
$error=$form->getError();
return$this->error('参数错误');
}
// 获取对应字段
$status=$form->status;
// 获取全部字段 返回数组类型 ['id'=>1, 'name'=>'billge', 'status'=>2]
$data=$form->values();
注意:在$_rules中未定义的字段,无法在$form中被获取到,就算不需要验证,也最好定义一下
在很多情况下,表单参数并不是都完全相同的,系统支持Form复用,即可以在通用的Form类中自定义一些内容
比如,还是上述例子的testForm,有个类似的表单,但是多了一个字段type,而且对于status的验证方式也需要变化
可以在testForm中添加一个方法// 在testForm中添加
publicfunctionaddType()
{
// 添加type字段, 默认'default', 规则为非空
$this->_rules['type']=[self::typeNonEmpty,'default'];
// 修改status的判断条件,改为valid_typeCmp()方法验证,记得要写这个方法哦
$this->_rules['status'][0]='typeCmp';
}
然后在Action中加载表单也需要添加'addType'作为参数,其他使用方法一致$form=$this->getForm('test','addType');
一个表单验证类里可以写多个附加方法,相互直接并不会有任何影响
验证类型
系统提供了7种默认验证方式,验证失败时都会记录错误信息,用户可以通过getError方法获取
self::typeInt 数字类型,包括整型浮点型,负数
self::typeBool 判断是否为true/false
self::typeArray 判断是否为数组类型
self::typeObject 判断是否为对象数据
self::typeDate 判断是否为一个合法的日期
self::typeDatetime 判断是否为一个合法的日期时间
self::typeNonEmpty 判断是否非空(包括null, 空字符串)
self::typeRequired 有该参数即可,可以为空字符串
验证类型几乎涵盖了所有情况,如果有不能满足的类型,用户可以自定义验证方法,上述例子中已有,不再过多阐述