php yaf框架扩展实践三——表单
基本上所有的请求进来,只要有用户输入的数据都需要进行数据验证。如果数据就一两个可以直接取到数据,然后写上一些简单的校验。可是当数据字段变多的时候,验证变复杂的时候,不好好整理封装一下可就真的不行了。
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);
可以看到短短的几行代码就完成表单验证的调用了,如果表单较为复杂更能体现方便性。当然在使用这个调用之前,必须先做好表单。
新建表单类
表单抽象类文件放置在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/