好的,这让我疯了。我正在完成IBM CakePHP教程,在第一部分中,我正处于作者为表单输入引入验证规则的部分:
www.ibm.com/developerworks/opensource/tutorials/os-php-cake1/section5.html#N107E3
对于我的生活,我无法弄清楚这行代码中发生了什么:
$this->invalidate('username_unique');
根据CakePHP文档,Model::invalidate()方法将第一个参数作为一个字符串,该字符串指定“要使其无效的字段的名称”。 “username_unique”如何验证要验证的字段的名称?在我看来它应该只是普通的旧“用户名”。但令人难以置信的是,作者的代码是有效的,当我将“username_unique”更改为“username”(甚至是“User.username”)时我的代码也没有,所以我认为文档中可能存在严重的缺陷(或者很可能,和我在一起。)
[FWIW,我可以看到CakePHP 1.25提供了一种更好的验证方法,但我仍然感到不安的是,似乎是一个记录良好的方法似乎没有做它所宣传的内容,而且我想要理解教程代码的工作原理。]
任何人都可以对此有所了解吗?
答案 0 :(得分:4)
在这种情况下,“魔法”实际上在$form
。
调用$this->invalidate('username_unique')
时,Cake会记下字段username_unique
无效。该字段实际上不存在的事实是无关紧要的。
现在,再看一下实际的$form
字段(稍微重新格式化):
echo $form->input('username', array(
'after' => $form->error('username_unique', 'The username is taken. Please try again.')
));
它正在输出普通表单字段,但“手动”在表单字段后面输出error()
输出。 $form->error('username_unique', $message)
表示“如果字段username_unique
出现错误,则输出消息$message
”。因此,您实际上将虚拟字段标记为无效,并手动输出此虚构字段的错误消息。
实际上,这是一个过时的cr * p,你应该立即忘记。 multiple validation rules per field有一个内置语法,因此您可以同时测试字符长度和唯一性,甚至可以为每种错误类型获取不同的错误消息。甚至还有内置的isUnique
规则,因此您甚至不必编写手动唯一性测试代码。