Yii2:如何为模型类动态添加验证规则?

Posted

技术标签:

【中文标题】Yii2:如何为模型类动态添加验证规则?【英文标题】:Yii2: How to add validation rules to the model class dynamically? 【发布时间】:2015-09-05 21:47:46 【问题描述】:

根据 Yii2 文档验证规则可以应用于隐式属性(表字段)或 userDefined 属性。

有没有办法为动态添加到模型类的属性创建验证规则?

例如:

让有一个名为“过滤器”的模型类和另一个名为“类别”的模型类 - 笔记本电脑、掌上电脑、台式机等类别。我可能想使用触控板区域作为笔记本电脑类别的过滤器之一,对角线长度为过滤器之一到掌上类别等等。因此,在每种情况下,过滤条件都会根据我选择的类别而有所不同,我可能希望将其动态添加到模型类过滤器中,并在通过 post 加载成功时进行验证。

【问题讨论】:

没有人说rules() 函数应该被编码为一个固定的数组,完全可以根据许多条件组装它。如果你也想要前端验证,它只会咬你,这要困难得多。 问题是,如果我不为动态添加的属性声明我的 rules(),模型类字段不会被填充。即 $model->load(yii->$app0->request->post()) 没有加载 $model 变量,因为 load() 正在调用 setAttributes() ,而 setAttributes() 又调用了 validate() 方法和这失败了,因为没有为动态添加的属性声明规则。 啊,但这不一定是规则相关的。 load & setAttributes 默认只接受 safe 属性。你也可以简单地覆盖safeAttributes(),独立于验证。 在尝试覆盖 safeAttributes() 时,我返回 $this->attributes(),但它只返回表属性,而不是用户定义或动态属性。 感谢您的帮助。我可以通过覆盖 safeAttributes() 来实现这一点。 【参考方案1】:

您可以对rules()-函数进行编码,以根据场景和数据输入构建一组验证规则。不要求这是一个固定数组。不幸的是,这样做会让你在前端遇到验证问题(如果你需要的话),那里的动态规则不能很好地工作。

从 cmets 我收集到最大的问题似乎是属性没有加载到模型中。这主要是因为load()setAttributes() 都只填充被认为是safe 的属性。

有两种方法可以将属性定义为安全的:

给它一个验证规则(至少safe) 在safeAttributes()返回的属性列表中获取它(通过覆盖它)

【讨论】:

以上是关于Yii2:如何为模型类动态添加验证规则?的主要内容,如果未能解决你的问题,请参考以下文章

在yii2中设置动态时区

MFC SDI中 如何为动态创建的按钮添加消息处理函数

jQuery validate:如何为正则表达式验证添加规则?

向动态创建的复选框 jQuery 添加验证

js如何为动态添加进来的a超级链接元素添加click事件函数

如何为数据表中动态添加的子行添加背景颜色?