資料檢驗
第一節
資料檢驗
建立自訂的資料檢驗規則可以協助確認Model裡資料是否合乎企業邏輯的需求,
例如密碼長度只能八個字元,使用者名稱字能使用文字等等。
資料檢驗的第一步是在Model裡建立檢驗規則。
這件事可透過定義Model裡的Model::validate陣列達成,例如:
/app/models/user.php
<?php
class User extends AppModel
{
var $name = 'User';
var $validate = array(
'login' => '/[a-z0-9\_\-]{3,}$/i',
'password' => VALID_NOT_EMPTY,
'email' => VALID_EMAIL,
'born' => VALID_NUMBER
);
}
?>
檢驗規則定義法是使用Perl相容的通用表示法,有些常用的規則已事先定義在/libs/validators.php。如:
- VALID_NOT_EMPTY
- VALID_NUMBER
- VALID_EMAIL
- VALID_YEAR
若model定義了$validate陣列,檢驗動作便會在資料儲存前自動啟動(呼叫Model::save()時)。
若想要手動啟動檢驗功能,
也可以直接呼叫Model::validates()(如果資料錯誤會傳回false)和Model::invalidFields()(傳回存有錯誤訊息的陣列)。
但通常資料都隱藏在controler的程式裡。
下面的範例示範如果使用檢驗的機制:
/app/controllers/blog_controller.php 內處理表單資料的Action
<?php
class BlogController extends AppController {
var $uses = array('Post');
function add ()
{
if (empty($this->data))
{
$this->render();
}
else
{
if($this->Post->save($this->data))
{
//太好了,資料合乎規則
}
else
{
//危險,威爾羅賓遜!檢驗結果錯誤。
$this->set('errorMessage', 'Please correct errors below.');
$this->render();
}
}
}
}
?>
這個action使用的view看起來可以像這樣:
在/app/views/blog/add.thtml加入表單的view
<h2>Add post to blog</h2>
<form action="<?php echo $html->url('/blog/add')?>" method="post">
<div class="blog_add">
<p>Title:
<?php echo $html->input('Post/title', array('size'=>'40'))?>
<?php echo $html->tagErrorMsg('Post/title', 'Title is required.')?>
</p>
<p>Body
<?php echo $html->textarea('Post/body') ?>
<?php echo $html->tagErrorMsg('Post/body', 'Body is required.')?>
</p>
<p><?=$html->submit('Save')?></p>
</div>
</form>
Controller::validates($model[, $model...])可用來啟動model裡自訂的檢驗規則。
Controller::validationErrors()則傳回model丟出的錯誤訊息,然後用tagErrorMsg()顯示於view內。
如果你想要設計些正規表示法無法表示的檢驗規則,可以使用model的invalidate()函式將某一欄位標示為錯誤。
例如我們想要在使用者要建立的使用者名稱已存在時,在表單上顯示錯誤訊息。
由於單單使用正規表示法很難表示這樣的規則,我們必需自己另外設計這個邏輯,接著把這個欄位標示為錯誤,
再經由Cake一般處理的流程處理。controller看起來像這樣:
<?php
class UsersController extends AppController
{
function create()
{
// 來查是否有提交表單資料
if (!empty($this->data['User']))
{
//看看這位使用者的姓名是否存在
$user = $this->User->findByUsername($this->data['User']['username']);
// 將欄位標示為錯誤,觸發HTML Helper的錯誤訊息。
if (!empty($user['User']['username']))
{
//產生tagErrorMsg('User/username')
$this->User->invalidate('username');
}
//試著儲存資料,如果有錯就不要做。
if($this->User->save($this->data))
{
$this->redirect('/users/index/saved');
}
else
{
$this->render();
}
}
}
}
?>
沒有留言:
張貼留言