在項(xiàng)目中經(jīng)常會(huì)使用到日期這個(gè)字段棠绘,而ThinkPHP3.2之前沒有提供驗(yàn)證日期的方法,因此需要我們自定義一個(gè)函數(shù)來進(jìn)行驗(yàn)證。
先來圖看看驗(yàn)證規(guī)則怎么寫:
接著就是具體的驗(yàn)證方法:
規(guī)則和驗(yàn)證方法都有了座云,下面就上代碼了:
驗(yàn)證規(guī)則:
protected $_validate = array(
array('card_no', 'require', '卡號(hào)不能為空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
array('start_date','checkDateFormat','開始日期格式錯(cuò)誤', self::MUST_VALIDATE, 'callback', self::MODEL_BOTH),
array('end_date','checkDateFormat','結(jié)束日期格式錯(cuò)誤', self::MUST_VALIDATE, 'callback', self::MODEL_BOTH),
array('group_id', 'require', '優(yōu)惠券組不能為空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
);
在驗(yàn)證規(guī)則中,我使用了回調(diào)方法的方式進(jìn)行驗(yàn)證的付材,當(dāng)然也可以使用函數(shù)來進(jìn)行驗(yàn)證朦拖,如果喜歡使用函數(shù)來進(jìn)行驗(yàn)證的話,先將這個(gè)方法放到公共的函數(shù)庫中厌衔,然后在將上面的callback替換為function就可以了璧帝。
接下來就是自定義驗(yàn)證方法的代碼:
/**
* 自動(dòng)驗(yàn)證日期格式
* @param $date
* @return bool
*/
protected function checkDateFormat( $date )
{
// 首先是驗(yàn)證日期的一般格式
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;
}
}
這里首先使用了正則表達(dá)式來驗(yàn)證日期的一般格式,即只要是“0000-00-00”這樣格式的日期富寿,都能通過正則表達(dá)式的驗(yàn)證(有關(guān)這個(gè)正則驗(yàn)證函數(shù)睬隶,可以參考PHP手冊來查看,現(xiàn)在我來解釋一下這個(gè)函數(shù)页徐,它要表達(dá)的意思是:在$date這個(gè)變量中匹配出最開始是4個(gè)數(shù)字-2個(gè)數(shù)字-2個(gè)數(shù)字苏潜,這樣的格式,如果存在的話变勇,就把對應(yīng)的數(shù)據(jù)放到$parts這個(gè)數(shù)組中)恤左,但是這并不是我們想要的,我們還需要驗(yàn)證這些匹配到的格式是否符合我們生活中正常的日期格式搀绣,因此就需要用到下面的這個(gè)函數(shù)飞袋。
checkdate()函數(shù)是用來驗(yàn)證一些日期是否是有效的格利高里日期,它的參數(shù)是分別是:月链患,日巧鸭,年,因此锣险,在上面我們匹配到的日期格式中蹄皱,需要將對應(yīng)的月日年傳入到這個(gè)函數(shù)中進(jìn)行判斷,它的返回值是布爾值芯肤,即結(jié)果為true或false巷折,那么我們就可以根據(jù)判斷的結(jié)果來確定傳入的是否是正常的日期格式的數(shù)據(jù),此函數(shù)的我們可以參考PHP手冊崖咨。