找出(在控制器中)哪个特定验证规则失败

lxa*_*lxa 6 cakephp cakephp-1.3

我有一个用户注册表单,email其中包含作为用户名的字段,并且应该在整个应用程序中是唯一的.

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

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'),
    ),
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sha*_*jad 6

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

基本上你只需要使用:

$errors = $this->ModelName->invalidFields();
Run Code Online (Sandbox Code Playgroud)

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


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

因此,我们想检查它是否是电子邮件,如果它是唯一的 - 我们希望模型中包含以下规则:

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

在每个"返回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
Run Code Online (Sandbox Code Playgroud)

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

Configure::read('UserValidationFail');
Run Code Online (Sandbox Code Playgroud)

哪个会给你'电子邮件'或'isUnique'.


Mus*_*mar 0

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

用户对象还有其他属性吗?打印它以查看里面的内容可能是个好主意。