【问题标题】:CakePHP validator Call to a member function setRules() on a non-objectCakePHP 验证器调用非对象上的成员函数 setRules()
【发布时间】:2014-02-17 10:27:14
【问题描述】:

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

我从UsersController 拨打beforeFilter 中的$this->User->setValidationRules($this->request->params['action'])

那么在UserModel类中,我有这个功能:

 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);

但我仍然遇到同样的错误。

我一直试图弄清楚这个问题,在整个互联网上搜索答案,但我似乎找不到任何答案。如果有人可以帮忙。我将不胜感激。

【问题讨论】:

  • 我也刚刚尝试在 AppModel 类中将 App::Uses(Validator, Model) 更改为 App::Uses(ModelValidator, Model) ,但仍然遇到同样的错误。

标签: php validation cakephp model forgot-password


【解决方案1】:

如果您的字段未在模型中定义,$this->validator()->getField('field') 可以返回 null

能否请您发布整个模型定义以及您调用setValidationRules 的控制器功能? (这是与模型同名的控制器还是不同的控制器?)

根据您迄今为止发布的内容,您似乎在正确设置验证器之前调用了Validator 方法。这表明字段名称中的拼写错误(不太可能)、未正确初始化的模型或对 setValidationRules 的调用发生在模型完全构建之前。我会确保控制器是唯一调用该函数的控制器。

您可以随时转储以下值:

  • $this->validator()
  • $this->validator()->getField('field')
  • $this->validator()->getField(null) - 获取验证器中所有可用字段的列表以及可能的问题指示。

您可以查看对setValidationRules() 的调用的堆栈跟踪,以确保它在您认为应该发生的时候发生。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2012-02-06
    相关资源
    最近更新 更多