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

Cakephp 找出(在控制器中)哪个特定验证规则失败,cakephp,cakephp-1.3,Cakephp,Cakephp 1.3,我有一个带有email字段的用户注册表单,该表单作为用户名,在应用程序中应该是唯一的 用户模型对此字段有以下验证规则: var $validate = array( 'email' => array( 'email' => array('rule' => 'email', 'allowEmpty' => false, 'last' => true, 'message' => 'Valid email address required')

我有一个带有
email
字段的用户注册表单,该表单作为用户名,在应用程序中应该是唯一的

用户
模型对此字段有以下验证规则:

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']))
),但是如何检查特定的规则失败


如果($this->User->validationErrors['email']==“已存在”),查找特定的错误消息,如
if($this->User->validationErrors['email']==“已存在”)
似乎不正确(l10n等)…

您没有指出正在使用的框架(看起来不像CodeIgniter)。但是,如果$this->User->validationErrors['email']返回一个简单的文本字符串,那么您就不能对它做太多处理

用户对象是否具有任何其他属性?打印出来看看里面是什么可能是个好主意。

阅读

基本上,您只需使用:

$errors = $this->ModelName->invalidFields();
这将为您提供一个包含所有验证错误的数组


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

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

CakePHP验证:

在每个的“returnfalse”之前,我们需要设置这个验证规则失败的地方。最简单的方法:我们可以打破MVC惯例,使用configuration类()并将其设置在那里,然后在控制器中相应地访问它

Configure::write('UserValidationFail','email'); //for email before return false
Configure::write('UserValidationFail','isUnique'); //for unique before return false
然后通过以下方式从控制器访问:

Configure::read('UserValidationFail');

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

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

嗯,invalidFields()同时包含字段和错误消息。您可以通过错误消息猜测规则,对吗

编辑:可以通过以下方式完成:

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

数据在模型中得到验证。我需要检查控制器中的验证结果(特定规则失败)。我需要知道特定规则失败
$this->Model->invalidFields()
返回相同的
Model->validationErrors
数组并显示错误消息。您为什么想知道这一点?通常只有失败(!empty())还是通过(empty())才重要!阅读问题:在我的控制器中,我想检查是否是“唯一”规则失败(显示不同的表单元素,如“发送密码恢复电子邮件”按钮)。也就是说,在这种特定的失败情况下,我想显示不同的表单。我能想到的唯一其他方法是编写您自己的自定义验证规则,失败时它将返回false,并且可能还会设置一个全局var/flatfile或具有失败规则的特定名称的东西,您可以访问?天哪,为什么要使用配置?只需在模型中设置
$this->emailNotUnique=true
。我在问题中提到,这是一种值得怀疑的方法:查找特定的错误消息,比如($this->User->validationErrors['email']==“已经存在”)似乎不正确(l10n等)……抱歉,我不知怎么跳过了它。2件事:对于l10n,cake实际上不会自动为您定位验证错误()。要解决您的问题:($this->User->validationErrors['email']===\uuuu(“已存在”,true))这是真的,但是比较消息仍然是不对的;例如,如果文案撰写人在几年后(当原始程序员不在的时候)更改错误消息,我们会得到一个相当严重的错误,我刚刚意识到可以这样做:($this->User->validationErrors['email']====(this->User->validate['email']['unique']['message'],true))。它仍然在比较消息,但我认为它是最优雅的。正确的应该是
this->User->validationErrors['email']==$this->User->validationErrors['email']['unique']['message']['message']
(因为
validationErrors
包含已本地化的消息。编辑您的答案以反映这种方法。