我在 CakePHP 2 工作,我一直在尝试使用动态验证,因为我需要不同的规则来让用户注册帐户(用户名和电子邮件都是必需的),但是当用户填写忘记密码表单时,用户名或电子邮件是必需的,但您不能同时填写用户名和电子邮件。
我从UsersController
beforeFilter
打电话给$this->User->setValidationRules($this->request->params['action'])
.
那么在User
模型类中,我有这个函数:
public function setValidationRules($action) {
if ($action == 'forgotten_password') {
$this->validator()->getField('username')->setRules($this->validationSets['forgottenPassword']);
$this->validator()->getField('email')->setRules($this->validationSets['forgottenPassword']['email']);
} else {
$this->validator()->getField('username')->setRules($this->validationSets['default']);
$this->validator()->getField('email')->setRules($this->validationSets['default']['email']);
}
return true;
}
但是我不断收到此错误:"在非对象上调用成员函数setRules()。
我一直在试图弄清楚这一点。在AppModel
类中,我添加了以下行:
App::Uses(Validator, Model);
但我仍然收到同样的错误。
我一直试图弄清楚这个问题很长时间,在互联网上搜索答案,但我似乎找不到任何答案。如果有人可以帮忙。我将不胜感激。
如果模型中未定义字段,$this->validator()->getField('field')
可以返回null
。
您能否发布整个模型定义以及您调用setValidationRules
的控制器函数?(这是与模型同名的控制器还是不同的控制器?
根据您到目前为止发布的内容,您似乎在正确设置验证器之前调用了Validator
方法。这表示字段名称中的拼写错误(不太可能)、模型未正确初始化或setValidationRules
调用发生在模型完全构建之前。我会确保控制器是唯一调用该函数的控制器。
您始终可以转储以下值:
$this->validator()
$this->validator()->getField('field')
$this->validator()->getField(null)
- 获取验证器中所有可用字段的列表,并可能指示问题。
您可以查看调用setValidationRules()
的堆栈跟踪,以确保它在您认为应该发生时发生。
如果在问题中发布更多数据,我将能够完善我的答案。