CodeIgniter DataMapper ORM 如何知道要应用哪组验证规则?
Posted
技术标签:
【中文标题】CodeIgniter DataMapper ORM 如何知道要应用哪组验证规则?【英文标题】:How does the CodeIgniter DataMapper ORM know which set of validation rules to apply? 【发布时间】:2011-04-21 12:00:00 【问题描述】:我正在使用 CodeIgniter DataMapper ORM,但有些东西我不太明白。
在本例中,http://datamapper.wanwizard.eu/pages/examples/login.html,您可以看到在 User 模型类上定义了一些 $validation
规则。
在login
函数内部,你也可以看到它调用了$this->validate()->get()
。当validation
函数运行时,它应该检查来自$validation
的所有 规则。
我不明白的是,对于登录用例,只需要验证用户名和密码,但您可以在示例中看到与此用例无关的其他验证规则。具体来说,$validation
上定义了一个confirm_password
规则,这个规则显然只针对更新用例,而不是登录用例。
由于我在示例中没有看到任何绕过这些不相关规则的代码,DataMapper ORM 是如何真正知道在login
函数中可以绕过这些不相关规则的?
非常感谢大家。
【问题讨论】:
【参考方案1】:也许解决方案是制作2个模型:一个是“登录”(用于表用户),另一个是“注册”(也用于表用户)。然后,当您要登录时,只需使用用户的登录模型。我认为这是模型的真正目的。 (现在您在 2 个模型中有 2 组验证)
【讨论】:
【参考方案2】:Datamapper 的验证方法会忽略不属于对象的字段的规则。因此confirm_password
规则不会触发,除非对象具有该字段名称的属性。
数据验证规则应该在模型中,而不是在控制器中,因为它是数据的唯一入口点,它确保所有进入数据库的数据都是验证。它也回答了 DRY,你不想在每个使用模型的控制器中定义验证规则。
鉴于这一事实,为可能在您的 CRUD 表单上的额外字段定义规则并将其全部保存在一个位置很简单。
【讨论】:
【参考方案3】:调用对象的 validate() 函数是应用验证规则所需的全部内容。请注意,只要您执行不带参数的 save() 调用,就会自动运行验证。您还可以在对象上运行或 validate()->get() 以使用对象当前字段值获取匹配记录。
http://datamapper.wanwizard.eu/pages/validation.html
我认为仅仅是因为验证将使用对象当前字段运行,而“confirm_password”字段是“非数据库表字段”。
【讨论】:
如果这是真的,它怎么知道应该为更新用例运行confirm_password
规则?
更新真的只是节省。您只需获取一个对象,设置要更改的字段,然后再次运行save()
。
是的,但是当用户想要更新他的密码时,DataMapper ORM 应该检查confirm_password
规则,当confirm_password
是非-数据库表字段无论是登录用例还是更新用例?【参考方案4】:
对于登录使用form_validation library
,并且只验证username/password
,对于registration
,您可以使用DataMapper
,并且在您的模型中添加规则confirm_password
必须匹配password
,但不要添加required
规则confirm_password
.. 应该这样做
【讨论】:
以上是关于CodeIgniter DataMapper ORM 如何知道要应用哪组验证规则?的主要内容,如果未能解决你的问题,请参考以下文章