CodeIgniter DataMapper ORM如何知道要应用哪组验证规则?

时间:2011-04-21 12:00:00

标签: php codeigniter orm codeigniter-datamapper

我正在使用CodeIgniter DataMapper ORM,但有些东西我不太明白。

在此示例http://datamapper.wanwizard.eu/pages/examples/login.html中,您可以看到在User模型类中定义了一些$validation规则。

login功能中,您还可以看到它调用$this->validate()->get()。运行validation函数时,应检查来自$validation所有规则。

我不明白的是,对于登录用例,只需要验证用户名和密码,但您可以看到示例中还有与此用例无关的其他验证规则。具体来说,confirm_password上定义了$validation规则,此规则显然仅适用于更新用例,而不是登录用例。

由于我没有在示例中看到任何代码绕过这些不相关的规则,DataMapper ORM如何实际知道login函数中可以绕过这些不相关的规则?

非常感谢大家。

4 个答案:

答案 0 :(得分:2)

也许解决方案是制作2个模型:一个是“登录”(对于表用户),另一个是“注册”(也用于表用户)。然后,当您想要登录时,只需使用用户的登录模型。我认为这是模型的真正目的。 (现在你在2个模型中有2套验证)

答案 1 :(得分:1)

  

调用对象的validate()函数就是应用验证规则所需的全部功能。请注意,只要执行不带参数的save()调用,就会自动运行validate。您还可以对对象运行或验证() - > get()以使用对象当前字段值获取匹配记录。

http://datamapper.wanwizard.eu/pages/validation.html

我认为仅仅因为验证将使用对象当前字段运行,而“confirm_password”字段是“非数据库表字段”。

答案 2 :(得分:1)

对于登录使用form_validation library并且仅验证username/password,对于registration,您可以使用DataMapper,并且在您的模型中添加规则confirm_password必须与{{1}匹配1}}但不要在password中添加required规则...应该这样做

答案 3 :(得分:1)

Datamapper的验证方法忽略不属于对象的字段的规则。因此,除非该对象具有该字段名称的属性,否则不会触发confirm_password规则。

数据验证规则应该在模型中,而不是在控制器中,因为它是数据的唯一入口点,并且它确保进入数据库的所有数据都是验证。它也回答了DRY,你不想在每个使用该模型的控制器中定义验证规则。

鉴于这一事实,定义可能在您的CRUD表单上的额外字段的规则很简单,并将它们保存在一个地方。