我正在使用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使用了多个验证规则集,虽然它可以实现我想要的,但会涉及很多重新编码。
在验证之前,我可以将输入设置为必需吗?
答案 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'
));