我正在使用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
函数中可以绕过这些不相关的规则?
非常感谢大家。
答案 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表单上的额外字段的规则很简单,并将它们保存在一个地方。