ZenTaoPHP框架中的數據驗證機制
數據驗證在web應用中尤其顯得重要。下面來給大家介紹下禪道(www.zentao.net/)框架的數據驗證機制。
一、首先來確定一個問題,即驗證的規則放在什么地方?
mvc程序中,每一層都可以放驗證規則。比如很多的表單驗證,會自動根據用戶的輸入進行驗證,然后給予提示。那么數據驗證放在哪一層呢?這個問題網絡上大家有很多的爭議。有的人主要放在view這一層,有的則主張放在control層。禪道框架選擇了model層。
為什么這樣做呢?因為model層是最低的一層,所有的數據操作,都要經過model來進行處理。那么只要在這一關把數據驗證做好,就可以保證數據的準確和安全。當然,框架的用戶,可以同時在前端加上js的驗證,和model層的驗證不會沖突的。下面來看下如何使用禪道的數據過濾機制。
禪道的數據過濾分為兩個部分,一個是數據修正,一個是數據驗證。這個是受php的filter擴展啟發,它里面就是分為了這兩個部分。先來看數據修正的例子:
二、數據修正:
$bug = fixer::input('post')
->add('openedBy', $this->app->user->account)
->add('openedDate', $now)
->setDefault('project,story,task', 0)
->setDefault('openedBuild', '')
->setIF($this->post->assignedTo != '', 'assignedDate', $now)
->setIF($this->post->story != false, 'storyVersion', $this->loadModel('story')->getVersion($this->post->story))
->specialChars('title,steps,keyword')
->cleanInt('product, module, severity')
->join('openedBuild', ',')
->remove('files, labels')
->get();
首先,是調用fixer這個類的input方法,它的參數post表示是從$_POST這個變量中獲取數據。
緊接著的兩行add(),是向數據中增加兩個變量。然后后面的兩行setDefault則是表示,當這個變量沒有傳值的時候,設成默認的值。
接下來是兩行setIF。setIF共有三個參數,第一個是判斷條件,后面兩個分別是key和value。也就是當條件為true的時候,設置$key = $value。
下面的spechialchars則表示對這三個字段進行htmlspecialchars處理;cleanInt則將變量處理成int類型,join,則將openedBuild使用,連接起來。
最后,還需要把兩個不需要的變量去掉,使用remove。
通過get方法就可以得到一個已經經過修改的完整的數據集合。這個集合已經可以準備入庫了。讓我們來看下數據是如何驗證的。
三、數據檢查
$this->dao->insert(TABLE_BUG)->data($bug)->autoCheck()->batchCheck($this->config->bug->create->requiredFields, 'notempty')->exec();
這句sql插入語句通過data方法,將修正過的數據傳遞給dao對象,然后通過autoCheck()對其進行自動檢查。autoCheck會根據數據庫里面字段的類型,長度進行判斷。如果類型不對,或者長度不對,會自動記錄錯誤。然后后面調用了batchCheck()方法,對一批字段進行非空的驗證。當然也可以通過check()方法對單個字段進行驗證。驗證的規則有很多,比如notempty, unique, email, account等等。
如果數據驗證過程中沒有錯誤,則執行了exec()方法,將數據插入數據庫。如果有錯呢?exec()方法則什么都只有執行。這個時候,就需要有control來進行判斷了。
if(dao::isError()) die(js::error(dao::getError())); 對,就是這樣一句話,如果dao::isError(),則執行getError()方法,然后將其合并成js的字符串,以警告框的形式彈出。執行了getError()之后,所有的錯誤被清空,這樣不會影響下次的執行。
更多開源詳情: http://www.zentao.net