【问题标题】:Changing validation on the fly in CakePHP在 CakePHP 中动态更改验证
【发布时间】:2014-10-23 00:48:20
【问题描述】:

我正在使用 CakePHP 2.3.8,我正在尝试找出是否有办法即时将某些验证规则设置为必需。

例如,我的用户模型具有电话号码、用户名、电子邮件和密码验证。如果用户想要更改他们的用户名,则不需要他们的电话号码。这意味着我不能将其设置为必需,因为当更改用户名时,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 使用了多个验证规则集,虽然它可以完成我想要的,但会涉及很多重新编码。

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

【问题讨论】:

  • 如果您在表单上只显示电子邮件字段,那么只有电子邮件将被验证。您无需担心用户名、密码验证

标签: php validation cakephp


【解决方案1】:

首先,在您的模型验证规则中,您有 phone_number,但仍尝试验证 phone,但没有电话验证规则。 理想的 request->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'
    ));

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多