CakePHP 验证器 在非对象上调用成员函数 setRules()



我在 CakePHP 2 工作,我一直在尝试使用动态验证,因为我需要不同的规则来让用户注册帐户(用户名和电子邮件都是必需的),但是当用户填写忘记密码表单时,用户名或电子邮件是必需的,但您不能同时填写用户名和电子邮件。

我从UsersControllerbeforeFilter打电话给$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()的堆栈跟踪,以确保它在您认为应该发生时发生。

如果在问题中发布更多数据,我将能够完善我的答案。

最新更新