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

Php Yii2:如何向模型类动态添加验证规则?,php,reflection,model,yii2,Php,Reflection,Model,Yii2,根据Yii2文档,验证规则可以应用于隐式属性(表字段)或用户定义的属性 是否有方法为动态添加到模型类的属性创建验证规则 例如: 假设有一个名为“Filter”的模型类和另一个名为“Category”的模型类,如笔记本电脑、掌上电脑、台式电脑等。我可能希望使用触摸板区域作为笔记本电脑类别的过滤器之一,对角线长度作为掌上电脑类别的过滤器之一,等等。因此,在每种情况下,过滤器条件都会根据我选择的类别而变化,如果通过post加载成功,我可能希望将其动态添加到模型类过滤器和验证中 您可以编写rules()

根据Yii2文档,验证规则可以应用于隐式属性(表字段)或用户定义的属性

是否有方法为动态添加到模型类的属性创建验证规则

例如:


假设有一个名为“Filter”的模型类和另一个名为“Category”的模型类,如笔记本电脑、掌上电脑、台式电脑等。我可能希望使用触摸板区域作为笔记本电脑类别的过滤器之一,对角线长度作为掌上电脑类别的过滤器之一,等等。因此,在每种情况下,过滤器条件都会根据我选择的类别而变化,如果通过post加载成功,我可能希望将其动态添加到模型类过滤器和验证中

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

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

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

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

没有人说
rules()
函数应该作为一个固定数组进行编码,完全可以根据多种条件进行组装。如果您还想进行前端验证,那么它只会对您造成影响,这要困难得多。问题是,如果我不为动态添加的属性声明我的规则(),那么模型类字段将无法填充。i、 e.$model->load(yii->$app0->request->post())没有加载$model变量,因为load()调用了setAttributes(),而setAttributes()又调用了validate()方法,这失败了,因为没有为动态添加的属性声明任何规则。啊,但这不一定与规则相关。默认情况下,
加载
设置属性
仅接受
安全
属性。您也可以独立于验证进行重写。在尝试重写safeAttributes()时,我返回$this->attributes(),但它只返回表属性,而不返回用户定义或动态属性。谢谢您的帮助。我可以通过重写safeAttributes()来实现这一点。