CakePHP IBM教程:Model :: validate()的API文档不正确?

时间:2009-10-24 06:58:34

标签: cakephp

好的,这让我疯了。我正在完成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提供了一种更好的验证方法,但我仍然感到不安的是,似乎是一个记录良好的方法似乎没有做它所宣传的内容,而且我想要理解教程代码的工作原理。]

任何人都可以对此有所了解吗?

1 个答案:

答案 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规则,因此您甚至不必编写手动唯一性测试代码。