我正在尝试在我的模型中使用此验证规则,但它无效。
我的意思是即使选择其他选项也始终保持安全。
[['dhanwantri_bill_number'], 'safe',
'when' => function($model) {
return $model->bill_type =='d';
},
'whenClient' => "function (attribute, value) {
return $('#opdtestbill-bill_type').val() == 'd';
}"
],
我做错了吗? 是否有任何替代解决方案来实现同样的目标。
感谢。
bill_type
的规则就像
[['bill_type'], 'string', 'max' => 20],
[['bill_type','test_name','date'], 'required'],
修改 根据doc
安全属性公共属性$ when - callable - 返回值确定的PHP可调用对象 是否应该应用此验证器。 YII \验证器\验证
$ whenClient - string - 返回值的JavaScript函数名称 确定是否应在客户端上应用此验证程序 侧。 YII \验证器\验证
答案 0 :(得分:4)
作为' safe'验证器只是告诉一个属性可以通过大规模分配来设置,这种方法是不合适的。它只是说当你使用load()方法时,属性可以得到一个值。如果没有标记为' safe'它不会阻止设置值,例如$model->dhanwantri_bill_number = 'asdf'
。所以这不是一个合适的解决方案。
更确切地说:“安全”'当$model->validate()
(通常使用$model->save()
调用)被调用时,属性不起作用。它仅在调用$model->load()
时使用。如果你查看source code of the SafeValidatior类,你会发现这个验证器没有任何反应。验证器没有做任何事情。它只是一个标记(您可能希望将其与例如RequiredValidator进行比较)。使用load()
'当'不使用表达式。所以你可以说' safe'在' 时不会使用' 。安全验证程序可能会在规则被评估时使用,但其validateAttribute()
为空,因此在该时间点没有任何反应。
除了代码中的whenClient
之外没有意义。这会发生什么?
我想有几种方法可以实现这一点。一个想法是让控制器不是通过load()设置属性,而是明确地设置它们并检查是否应该设置$model->dhanwantri_bill_number
。或者您可以使用load(),然后根据设置的$model->bill_type
加载后还原属性。
或者您可以在模型中为dhanwantri_bill_number实现setter方法,并在那里选择是否设置了属性。可能依赖于场景。
答案 1 :(得分:1)
来自Yii2 doc:
默认情况下,活动属性被认为是安全的,可以大规模分配。如果不应该大规模地分配属性(因此被认为是不安全的),请在属性前加上感叹号(例如'!rank')。
考虑使用方案来处理您的问题。 http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios