資料檢驗

第一節

資料檢驗

建立自訂的資料檢驗規則可以協助確認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();
            }
        }
    }
}

?>
 

附錄:讀者筆記