【问题标题】:CakePHP validatation rules for many actions用于许多操作的 CakePHP 验证规则
【发布时间】:2011-05-13 16:00:39
【问题描述】:

我在网上搜索了 cakePHP 书/API 和 StackOverflow,但似乎找不到答案。我遇到的问题是为我正在构建的应用程序创建用户。我的控制器中有用于添加操作的密码验证规则,这些规则运行良好 - 没有任何问题,甚至 Auth 组件也很高兴。我创建了一个与我的数据模型完美配合的 change_password 操作(如 - 实际发生更改),但没有对其应用验证,即使我将表单字段命名为与添加操作完全相同。

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

非常感谢!! 约翰

编辑,现在添加代码 sn-ps,看起来合适。

首先是动作:

    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)

【问题讨论】:

  • 糟糕!忘了注意我使用的是 cakePHP 1.3 版。如果有帮助,我会提供代码 sn-ps,但这更多是一个理论上的问题:验证规则可以应用于多个操作吗?

标签: cakephp validation


【解决方案1】:

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

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

【讨论】:

  • 这不一定是正在发生的事情。经过进一步思考,验证似乎在 change_password 中进行到一半。这肯定需要我匹配密码表单字段,但它会允许空白(这与我的验证规则相反)。请参阅上面我编辑的帖子...也许是时候编写一些代码 sn-ps。
  • 当你说它允许空白时,你的意思是你传递的数据中不存在索引,或者索引存在,但值设置为空/空字符串?
  • 检查我上面的编辑。希望这将对此有所了解。我已经包含了动作的 sn-ps、它的验证和视图。我从“add”操作中窃取了代码来创建“change_password”。非常感谢您的宝贵时间!
  • 天啊。显然,我应该更仔细地查看我的验证规则,并得出一个令人震惊的结论:标记为“on”=>“create”的规则是问题所在。删除它使我的验证工作完美(尽管消息不再出现......只是主要的闪存消息说“密码无法更改”......我会尝试自己解决这个问题)。再次感谢您的帮助!
【解决方案2】:

密码会自动进行哈希处理,因此您需要对其他密码字段进行哈希处理以进行比较。我通常在模型中的 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,密码n密码2和当前密码在密码更改表上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2016-06-18
    • 1970-01-01
    相关资源
    最近更新 更多