【问题标题】:Find out (in controller) which specific validation rule failed找出(在控制器中)哪个特定的验证规则失败
【发布时间】:2011-10-06 07:33:58
【问题描述】:

我有一个带有email 字段的用户注册表单,该字段充当用户名,并且在整个应用程序中应该是唯一的。

User 模型具有以下是该字段的验证规则:

var $validate = array(
    'email' => array(
        'email' => array('rule' => 'email', 'allowEmpty' => false, 'last' => true, 'message' => 'Valid email address required'),
        'unique' => array('rule'=> 'isUnique', 'message' => 'Already exists'),
    ),
);

在我的控制器中,我想检查是否是 'unique' 规则失败(显示不同的表单元素,例如“发送密码恢复电子邮件”按钮)。

我可以检查email 字段是否有效(if (isset($this->User->validationErrors['email']))),但是如何检查特定规则失败

寻找像if ($this->User->validationErrors['email'] == "Already exists") 这样的特定错误消息似乎不正确(l10n 等)...

【问题讨论】:

    标签: cakephp cakephp-1.3


    【解决方案1】:

    阅读http://book.cakephp.org/2.0/en/models/data-validation/validating-data-from-the-controller.html

    基本上你只需要使用:

    $errors = $this->ModelName->invalidFields();
    

    这将为您提供所有验证错误的数组。


    更新(自定义验证规则):

    所以我们想检查它是否是一封电子邮件,以及它是否是唯一的——我们希望模型中有以下规则:

    CakePHP 验证:http://book.cakephp.org/2.0/en/models/data-validation.html

    在每个“return false”之前,我们需要设置这个验证规则失败的地方。最简单的方法:我们可以打破 MVC 约定,使用配置类 (http://book.cakephp.org/view/924/The-Configuration-Class) 并将其设置在那里,并在控制器中相应地访问它。

    Configure::write('UserValidationFail','email'); //for email before return false
    Configure::write('UserValidationFail','isUnique'); //for unique before return false
    

    然后从控制器通过以下方式访问它:

    Configure::read('UserValidationFail');
    

    这将为您提供“电子邮件”或“isUnique”。

    【讨论】:

    • 我需要知道特定规则失败了。 $this->Model->invalidFields() 返回相同的 Model->validationErrors 数组和错误消息。
    • 你为什么想知道这个?通常只有失败(!empty())或通过(empty())才重要!
    • 阅读问题:在我的控制器中,我想检查是否是“唯一”规则失败(显示不同的表单元素,例如“发送密码恢复电子邮件”按钮)。 即如果发生这种特定的失败,我想显示不同的形式。
    • 我能想到的唯一其他方法是编写您自己的自定义验证规则,失败时它将返回 false 并且可能还设置一个全局 var / flatfile 或具有特定名称的失败规则你可以访问吗?
    • 天哪,为什么要使用配置?只需在模型中设置$this->emailNotUnique = true
    【解决方案2】:

    您没有指出您使用的是哪个框架(看起来不像 CodeIgniter)。但是,如果 $this->User->validationErrors['email'] 返回一个简单的文本字符串,那么您就无能为力了。

    用户对象还有其他属性吗?打印_r 看看里面有什么可能是个好主意。

    【讨论】:

      【解决方案3】:

      帖子上有 Cakephp 标签。不要验证来自控制器的数据,始终尝试在模型中执行此操作并将其推送给控制器和查看器...

      【讨论】:

      • 数据在模型中得到验证。我需要检查控制器中的验证结果(特定规则失败)。
      【解决方案4】:

      好吧,invalidFields() 包括字段和错误消息。你可以通过错误信息猜出规则吧?

      编辑:可以这样做:

      $this->User->validationErrors['email'] == $this->User->validate['email']['unique']['message']
      

      【讨论】:

      • 我在问题中提到这是值得怀疑的方法:寻找特定的错误消息,例如 if ($this->User->validationErrors['email'] == "Already exists") just似乎不对(l10n 等)....
      • 抱歉,不知何故我跳过了那个。两件事:对于 l10n,cake 实际上不会自动为您定位验证错误 (book.cakephp.org/view/1230)。解决您的问题: ($this->User->validationErrors['email'] == __("Already exists",true))
      • 确实如此,但是比较 messages 仍然不对;例如,如果撰稿人几年后会更改错误消息(当原始程序员不在时),我们将得到一个非常讨厌的错误
      • 我刚刚意识到可以这样做:($this->User->validationErrors['email'] == __($this->User->validate['email'][ '唯一']['消息'],真))。它仍在比较消息,但我想它已经尽可能优雅了。
      • 正确的是 $this->User->validationErrors['email'] == $this->User->validate['email']['unique']['message'](因为 validationErrors 包含已本地化的消息。编辑您的答案以反映这种方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多