CakePHP验证规则适用于许多操作

时间:2011-05-13 16:00:39

标签: cakephp validation

我在网上,cakePHP book / API和StackOverflow上搜索过,但似乎无法找到答案。我遇到的问题是为我正在构建的应用程序创建用户。我的控制器中的添加操作的密码验证规则工作正常 - 没有任何问题,甚至Auth组件也很满意。我已经创建了一个与我的数据模型完美匹配的change_password动作(如实际发生的 - 更改),但是没有对它应用验证,即使我将表单字段命名为与添加操作完全相同。

多个操作可以不共享相同的验证吗?我是否必须在change_password操作中稍微重命名我的表单ID,然后创建新的验证变量来匹配这些?这对我来说似乎效率很低,但如果我不得不走这条路,我会。

非常感谢!! 约翰

编辑,现在添加代码段,因为它似乎是合适的。

首先是行动:

    function change_password($id = null) {
    if (!empty($this->data)) {
        if (!empty($this->data['User']['passwd'])) {
            $this->data['User']['password'] = $this->Auth->password($this->data['User']['passwd']);
        }
        if ($this->User->save($this->data)) {
            $this->Session->setFlash('Password has been changed');
            $this->redirect(array('controller' => 'bookings', 'action' => 'index'));
        } else {
            $this->Session->setFlash('Password could not be changed');
        } 
    }

现在验证规则(再次注意这些对我的添加操作非常有效,它们只是在change_password中失败):

    var $validate = array(
    'first_name' => array(
        'notempty' => array('rule' => array('notempty')),
    ),
    'last_name' => array(
        'notempty' => array('rule' => array('notempty')),
    ),
    'email' => array(
        'email' => array('rule' => array('email')),
    ),
    'group_id' => array(
        'numeric' => array('rule' => array('numeric')),
    ),
    'active_user' => array(
        'boolean' => array('rule' => array('boolean')),
    ),
    'passwd' => array(
        'rule' => array('minLength', '6'),
        'message' => 'Password should be at least 6 characters long',
        'required' => true,
        'allowEmpty' => false,
        'on' => 'create'
    ),
    'passwd_confirm' => array(
        'rule' => 'matchpwd',
        'message' => 'Confirm password doesnt match'
    ),
);

    function matchpwd($data){
    if ($this->data['User']['passwd'] != $data['passwd_confirm'] ) {
        return false;
    }
    return true;
}

最后,观点(虽然我不认为添加这个会有所帮助,但无论如何我都包括它):

    <div class="users form">
    <?php echo $form->create('User', array('action'=>'change_password'));?>
<fieldset>
    <legend><?php __('Change Password for "'.$User_to_change.'"');?></legend>
<?php
    echo $form->input('id');
    echo $form->input('passwd', array(
            'type' => 'password')
        );
    echo $form->input('passwd_confirm', array(
            'type' => 'password')
        );
?>
</fieldset>
    <?php echo $form->end('Submit');?>
    </div>

我在下面的答案中提到验证似乎是“中途工作”。当我尝试在“passwd”表单字段中输入密码但将“passwd_confirm”留空时,控制器的保存操作失败,我看到闪存消息“密码无法更改”。所以显然它在我的验证规则中运行了matchpwd函数。但是,为两个框输入空白值都会成功,因此就好像它没有通过其他验证规则。

(如果代码缩进没有正确显示,请原谅。如您所见,我有点像StackOverflow n00b)

2 个答案:

答案 0 :(得分:0)

Cake验证系统的一大好处是您只需编写一次规则。在控制器加载模型定义时,默认情况下,任何使用模型的操作都将应用规则。

我认为最有可能发生的是required参数设置为true。如果该字段为空,则会导致验证失败。

答案 1 :(得分:0)

密码会自动进行哈希处理,因此您需要哈希其他密码字段以进行比较。我通常在模型中的beforeSave函数中执行它:

function beforeSave() {
    if(!empty($this->data['User']['password2'])) {
        $this->data['User']['password']=Security::hash($this->data['User']['password2'], null, true);
    }
    return true;
}

我将这些验证规则用于我的pw字段:

    'password' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Give a password.',
        ),
    ),
    'password2' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Give a password.',
        ),
    ),
    'passwordn' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Give a password.',
        ),
    ),
    'current_password' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Give a password.',
        ),
    ),

用于注册的密码和密码2,密码密码2和current_password位于更改表格上。