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,你可以使用model的invalidate()函数将一个字段标记为错误。假设当一个用户打算创建一个在系统已经存在的用户时,你会在表单上显示一个错误。因为你不会使用regex要Cake查出它们,所以你需要实现你自己的验证,将字段标记为无效并调用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();
}
} } } ?> |