php yaf框架扩展实践三——表单

2018-03-19 18:26:43 查看 1408 回复 0

基本上所有的请求进来,只要有用户输入的数据都需要进行数据验证。如果数据就一两个可以直接取到数据,然后写上一些简单的校验。可是当数据字段变多的时候,验证变复杂的时候,不好好整理封装一下可就真的不行了。

yaf中并没有封装表单验证的操作,这里对表单验证做了一些封装,开发起来就更加快捷了,下面说明下。

未封装表单的数据验证

$name     = $this->getRequest()->getPost("name");
$password = $this->getRequest()->getPost("password");

//校验name字段
if (strlen($name) >= 6...) {
    //字段没有通过验证处理
}

//校验password字段
if (strlen($password) >= 8 ...) {
    //字段没有通过验证处理
}

封装后的表单验证

//实例化表单对象,并传入需要验证的参数数组
//其中键表示字段名
$form = new \Forms\User\LoginModel($this->getRequest()->getParams());
//调用表单对象的校验方法,该方法会根据字段设置校验所有字段
if (!$form->validate()) {
    //校验失败,可以通过getMessages获取有错误字段的错误信息
    var_dump($form->getMessages());
    exit();
}
//表单校验通过,通过getFieldValue获取所有字段的值
$params = $form->getFieldValue();
var_dump($params);

可以看到短短的几行代码就完成表单验证的调用了,如果表单较为复杂更能体现方便性。当然在使用这个调用之前,必须先做好表单。

新建表单类

yaf扩展表单验证

表单抽象类文件放置在application/models/forms/Abstract.php,新建的表单都可以继承这个类,而后定义表单的字段。例如验证用户登录表单:

namespace Forms\User; 

/**
 * 用户登录表单
 */
class LoginModel extends \Forms\AbstractModel {

    /**
     * 表单字段
     *
     * @var array
     */
    protected $_fields = array(
        'mobile' => array(
            'label' => '手机号码',
            'name' => 'mobile',
            "validate" => array(
                array("type" => "string", "min" => "11", "max" => "11", "msg" => "手机号码输入格式不对")
            ),
        ),
        'password' => array(
            'label' => '密码',
            'name' => 'password',
            "validate" => array(
                array("type" => "string", "min" => "6", "max" => "18", "msg" => "密码长度6到18位")
            ),
        )
    );

}

类中有一个属性$_fields用来设置改表单的字段,是一个多维数组,键值表示字段的名称,内部使用如下字段来设置相应的信息:

  • label:表示字段显示的名字
  • name:表示字段名称,和键值是一样的
  • require:表示字段是否必须
  • default:如果字段没有传入则设置为该默认值,require为false时可以设置
  • message:该字段验证失败时的错误信息
  • validate:表示校验器链,可以用来设置字段的校验器

validate相关字段说明

  • type:校验器类型,目前支持整形(int)、字符串(string)、浮点数(float)、日期(date)、集合(set)
  • msg:表示该校验没有通过时,字段显示的错误信息

整形校验

当type为整形int时,可以 通过min和max限制范围

'id' => array(
    'label'    => '编号',
    'name'     => 'id',
    'require'  => true, 
    'message' => '编号不能为空',
    "validate" => array(
        array("type" => "int", "min" => "1", "max" => "1000000", "msg" => "编号不正确")
    ),
),

字符串校验

当type为字符串string时,min和max表示限制的长度范围

'name' => array(
    'label'    => '姓名',
    'name'     => 'name',
    'require'  => true, 
    'message' => '姓名不能为空',
    "validate" => array(
        array("type" => "string", "min" => "2", "max" => "20", "msg" => "姓名长度不正确")
    ),
),

浮点数校验

校验金额的时候多用这个

'amount' => array(
    'label'    => '总额',
    'name'     => 'amount',
    'require'  => true, 
    'message' => '总额不能为空',
    "validate" => array(
        array("type" => "float", "min" => "0.01", "max" => "299.99", "msg" => "总额不正确")
    ),
),

日期校验

日期校验会校验输入的日期是否和给定的格式(formats)一致,并且也会校验给定的时间是否是合理的时间

'birthday' => array(
    'label'    => '生日',
    'name'     => 'birthday',
    'require'  => true, 
    'message' => '生日不能为空',
    "validate" => array(
        array("type" => "date", "formats" => array("Y-m-d", "Y/m/d"), "msg" => "生日格式不正确")
    ),
),

集合校验

校验值是否在给定的集合(set)内

'sex' => array(
    'label'    => '性别',
    'name'     => 'sex',
    'require'  => true, 
    'message' => '性别不能为空',
    "validate" => array(
        array("type" => "set", "set" => array("1","2","3"), "msg" => "性别格式不正确")
    ),
),

自定义校验方法

有时候校验器无法满足所有需求,这时候还可以通过自定义方法进行验证。在表单类中名字由validate+字段名开头的方法将被调用进行该字段的验证,需要返回true或者false。

较完整的示例

namespace Forms\User;

/**
 * 表单demo
 */
class DemoModel extends \Forms\AbstractModel {

    /**
     * 表单字段
     *
     * @var array
     */
    protected $_fields = array(
        'demo1' => array(
            'label' => 'demo1',
            'name' => 'demo1',
            'require' => true, //表示字段是否必须
            "validate" => array(
                array("type" => "int", "min" => "1", "max" => "3", "msg" => "demo1不正确")
            ),
        ),
        'demo2' => array(
            'label' => 'demo2',
            'name' => 'demo2',
            'require' => false, //字段非必须
            'default' => "123456", //如果字段没有传入则设置该默认值,require为false时可以设置
            "validate" => array(
                array("type" => "string", "min" => "6", "max" => "18", "msg" => "demo2不正确")
            ),
        ),
    );

    /**
     * 校验demo2字段,名字由validate+字段名开头的方法将被调用
     *
     * @return boolean
     */
    public function validateDemo2() {
        $demo2 = $this->getFieldValue("demo2");
        //这里可以进行更加复杂的校验

        return true;
    }

}

本文转自:http://www.01happy.com/php-yaf-ext-form/