表单验证

框架提供了一套完整的表单验证解决方案,适用于绝大多数场景。

表单验证支持所有类型的验证以及自定义方法

简单示例:

  1. namespace app\form;
  2. use biny\lib\Form;
  3. /**
  4. * @property \app\service\testService $testService
  5. * 自定义一个表单验证类型类 继承Form
  6. */
  7. class testForm extends Form
  8. {
  9. // 定义表单参数,类型及默认值(可不写,默认null)
  10. protected $_rules = [
  11. // id必须为整型, 默认10
  12. 'id'=>[self::typeInt, 10],
  13. // name必须非空(包括null, 空字符串)
  14. 'name'=>[self::typeNonEmpty],
  15. // 自定义验证方法(valid_testCmp)
  16. 'status'=>['testCmp']
  17. ];
  18.  
  19. // 自定义验证方法
  20. public function valid_testCmp()
  21. {
  22. // 和Action一样可以调用Service和DAO作为私有方法
  23. if ($this->testService->checkStatus($this->status)){
  24. // 验证通过
  25. return $this->correct();
  26. } else {
  27. // 验证失败,参数可以通过getError方法获取
  28. return $this->error('非法类型');
  29. }
  30. }
  31. }

定义完验证类,然后就可以在Action中使用了,可以通过getForm方法加载表单

  1. // 加载testForm
  2. $form = $this->getForm('test');
  3. // 验证表单字段,true/false
  4. if (!$form->check()){
  5. // 获取错误信息
  6. $error = $form->getError();
  7. return $this->error('参数错误');
  8. }
  9. // 获取对应字段
  10. $status = $form->status;
  11. // 获取全部字段 返回数组类型 ['id'=>1, 'name'=>'billge', 'status'=>2]
  12. $data = $form->values();

注意:$_rules中未定义的字段,无法在$form中被获取到,就算不需要验证,也最好定义一下

在很多情况下,表单参数并不是都完全相同的,系统支持Form复用,即可以在通用的Form类中自定义一些内容

比如,还是上述例子的testForm,有个类似的表单,但是多了一个字段type,而且对于status的验证方式也需要变化

可以在testForm中添加一个方法

  1. // 在testForm中添加
  2. public function addType()
  3. {
  4. // 添加type字段, 默认'default', 规则为非空
  5. $this->_rules['type'] = [self::typeNonEmpty,'default'];
  6. // 修改status的判断条件,改为valid_typeCmp()方法验证,记得要写这个方法哦
  7. $this->_rules['status'][0] = 'typeCmp';
  8. }

然后在Action中加载表单也需要添加'addType'作为参数,其他使用方法一致

  1. $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 有该参数即可,可以为空字符串

验证类型几乎涵盖了所有情况,如果有不能满足的类型,用户可以自定义验证方法,上述例子中已有,不再过多阐述