2015-06-19 69 views
2

根据Yii2文档,可以将验证规则应用于隐式属性(表字段)或用户定义的属性。Yii2:如何动态地将验证规则添加到模型类中?

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

例如:

要有一个名为“过滤器”模型类,并命名为“类别”另一个模型类 - 类别,如笔记本电脑,掌上电脑,台式机等。我可能需要使用触控板区域作为一个过滤器以笔记本类别和对角线长度作为过滤器到掌上类别之一等等。因此,在任何情况下,过滤条件都会根据我选择的类别而有所不同,我可能希望将其添加到模型类Filter并动态验证,如果通过发布加载成功。

+3

没有人说'rules()'函数应该被编码为一个固定数组,根据许多条件来组装它是完全可能的。如果你还想要前端验证,它只会咬你,这是困难的。 – Blizz

+0

问题是如果我没有为动态添加的属性声明我的规则(),模型类字段没有被填充。例如$ model-> load(yii - > $ app0-> request-> post())不会加载$ model变量,因为load()调用setAttributes(),然后调用validate()方法,这会失败,因为没有为动态添加的属性声明规则。 –

+0

啊但这不一定是相关的规则。 'load'&'setAttributes'默认只接受'safe'属性。你也可以简单地重写['safeAttributes()'](http://www.yiiframework.com/doc-2.0/yii-base-model.html#safeAttributes()-detail),而与验证无关。 – Blizz

回答

2

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

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

有两种方法来定义属性为安全:

  • 给它一个验证规则(至少是safe
  • 得到它的safeAttributes()返回(通过重写它的属性列表)