CakePHP中文手册【翻译】-数据验证

 

数据验证

1

数据验证

创建自定义的验证规则可以帮助你确保Model的数据遵循应用程序里的业务规则,例如密码仅可以为8个字符长度,用户名仅可以是字母等。

数据验证的第一步是在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()(它返回一个错误消息的数组)

但是通常在controller代码里,数据是隐式的。下面的例子会描述如何创建一个表单处理的动作:

/app/models/blog_controller.php的表单处理动作

<?php

class BlogController extends AppController {

 

   var $uses = array('Post');

 

   function add ()

   {

      if (empty($this->data))

      {

         $this->render();

      }

      else

      {

         if($this->Post->save($this->data))

         {

             //ok cool, the stuff is valid

         }

         else

         {

            //Danger, Will Robinson. Validation errors.

            $this->set('errorMessage', 'Please correct errors below.');

            $this->render();

         }

      }

   }

}

?>

动作使用的view可以是:

/app/views/blog/add.thtml中增加表单view

<h2>Add post to blog</h2>

 

 <?php if(!empty($errorMessage): ?>

 

 <p><?php echo $errorMessage; ?>

 

 <?php endif;?>

         

 <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增加的任何自定义的验证规则。此方法会返回任何在model里抛出的错误信息,这样可以在view里,tagErrorMsg()可以将他们显示。

如果你打算完成某些自定义的验证,而且这些验证去除了基于Cake验证的regex,你可以使用modelinvalidate()函数将一个字段标记为错误。假设当一个用户打算创建一个在系统已经存在的用户时,你会在表单上显示一个错误。因为你不会使用regexCake查出它们,所以你需要实现你自己的验证,将字段标记为无效并调用Cake的正常表单的无效处理过程。

Controller可以如下:

<?php

 

class UsersController extends AppController

{

    function create()

    {

        // Check to see if form data has been submitted

        if (!empty($this->data['User']))

        {

            //See if a user with that username exists

            $user = $this->User->findByUsername($this->data['User']['username']);

 

            // Invalidate the field to trigger the HTML Helper's error messages

            if (!empty($user['User']['username']))

            {

                $this->User->invalidate('username');//populates tagErrorMsg('User/username')

            }

 

            //Try to save as normal, shouldn't work if the field was invalidated.

            if($this->User->save($this->data))

            {

                $this->redirect('/users/index/saved');

            }

            else

            {

                 $this->render();

            }

 

        }

    }

}

 

?>

Last Updated:2006-12-03
posted @ 2006-11-25 15:29  张太国  阅读(...)  评论(...编辑  收藏