在CakePHP中即时更改验证

时间:2014-10-23 00:48:21

标签: php validation cakephp

我正在使用CakePHP 2.3.8,我试图弄清楚是否有办法将某些验证规则设置为动态要求。

例如,我的用户模型有phone_number,用户名,电子邮件和密码验证。如果用户想要更改其用户名,则不需要他们的电话号码。这意味着我无法将其设置为必需,因为在更改用户名时,预计phone_number将出现在数据中。

 public $validate = array(

   'username' => array(
        'minLength' => array(
             'rule' => array('minLength', '3'),
             'message' => 'A username with a minimum length of 3 characters is required'
          ),
          'unique' => array(
                'rule'   => 'isUnique',
                'message' => 'This username has already been taken.'
           )
    ),
    'email' => array(
        'email' => array(
            'rule'    => array('email'),
            'message' => 'Please enter a valid email address.',
        ),
        'unique' => array(
            'rule'    => 'isUnique',
            'message' => 'This email address is already in use'
        )
    ),
    'password' => array(
         'rule' => array('minLength', '8'),
         'message' => 'A password with a minimum length of 8 characters is required'
    ),
    'phone_number' => array(
        'rule' => array('valid_phone'),
        'message' => 'Invalid phone number',
    )
);

为了解决这个问题,在我的控制器中进行相应的操作,我一直在做的是检查以确保已发布预期的输入。如果不是,请将该索引设置为null,以便对其进行验证...例如

public function change_username(){

    if(!isset($this->request->data['username'])){
        $this->request->data['username'] = null;
    }

    $this->ExampleModel->set($this->request->data);

    //if it wasn't posted, the username index will be created but set to null. This is my workaround for setting something to "required"
    if($this->ExampleModel->validates() == true){
        //do something
    }
    else{
        //do something
    }
}

虽然这有效,但我觉得它会产生很多额外的编码,特别是如果我有一个有大量输入的表单。

我还试图仅验证我需要的输入,但除非数据被发布,否则它会忽略它们。例如

if($this->ExampleModel->validates(array('fieldList' => array('phone')) == true){
    .....
}

如果未发布“手机”,则不会对其进行验证。

有没有办法在运行中将给定输入验证所需的设置设置为true?我发现this article使用了多个验证规则集,虽然它可以实现我想要的,但会涉及很多重新编码。

在验证之前,我可以将输入设置为必需吗?

1 个答案:

答案 0 :(得分:1)

首先,在您的模型验证规则中,您有 phone_number 但尚未尝试验证手机,但手机没有验证规则。 理想的请求 - > data []匹配模型字段,您可以重建数组等。

来自book.cakephp

这将向模型中的密码字段添加单个规则。您可以链接多个要添加的调用以创建任意数量的规则:

$this->validator()
    ->add('password', 'required', array(
        'rule' => 'notEmpty',
        'required' => 'create'
    ))
    ->add('password', 'size', array(
        'rule' => array('between', 8, 20),
        'message' => 'Password should be at least 8 chars long'
    ));