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 如何知道要应用哪组验证规则?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别