在项目中经常会使用到日期这个字段,而ThinkPHP3.2之前没有提供验证日期的方法,因此需要我们自定义一个函数来进行验证。
先来图看看验证规则怎么写:
接着就是具体的验证方法:
规则和验证方法都有了,下面就上代码了:
验证规则:
protected $_validate = array(
array('card_no', 'require', '卡号不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
array('start_date','checkDateFormat','开始日期格式错误', self::MUST_VALIDATE, 'callback', self::MODEL_BOTH),
array('end_date','checkDateFormat','结束日期格式错误', self::MUST_VALIDATE, 'callback', self::MODEL_BOTH),
array('group_id', 'require', '优惠券组不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
);
在验证规则中,我使用了回调方法的方式进行验证的,当然也可以使用函数来进行验证,如果喜欢使用函数来进行验证的话,先将这个方法放到公共的函数库中,然后在将上面的callback替换为function就可以了。
接下来就是自定义验证方法的代码:
/**
* 自动验证日期格式
* @param $date
* @return bool
*/
protected function checkDateFormat( $date )
{
// 首先是验证日期的一般格式
if (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts)) {
if (checkdate( $parts[2], $parts[3], $parts[1])) {
return true;
} else {
return false;
}
} else {
return false;
}
}
这里首先使用了正则表达式来验证日期的一般格式,即只要是“0000-00-00”这样格式的日期,都能通过正则表达式的验证(有关这个正则验证函数,可以参考PHP手册来查看,现在我来解释一下这个函数,它要表达的意思是:在$date这个变量中匹配出最开始是4个数字-2个数字-2个数字,这样的格式,如果存在的话,就把对应的数据放到$parts这个数组中),但是这并不是我们想要的,我们还需要验证这些匹配到的格式是否符合我们生活中正常的日期格式,因此就需要用到下面的这个函数。
checkdate()函数是用来验证一些日期是否是有效的格利高里日期,它的参数是分别是:月,日,年,因此,在上面我们匹配到的日期格式中,需要将对应的月日年传入到这个函数中进行判断,它的返回值是布尔值,即结果为true或false,那么我们就可以根据判断的结果来确定传入的是否是正常的日期格式的数据,此函数的我们可以参考PHP手册。