我试图在我的模型中使用这个验证规则,但它不起作用。
我的意思是,即使选择其他选项,它也始终保持安全。
[['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'],
编辑符合文档的安全属性公共属性
$when-callable-一个PHP可调用程序,其返回值决定是否应该应用此验证器。yii''验证器''验证器
$whenClient-string-返回值的JavaScript函数名确定是否应在客户端上应用此验证器一边yii''验证器''验证器
由于"安全"验证程序只是告诉可以通过大量赋值来设置属性,因此该方法不合适。它只是说,当你使用load()方法时,属性可以得到一个值。如果未标记为"安全",则不会阻止使用例如$model->dhanwantri_bill_number = 'asdf'
设置值。因此,这不是一个恰当的解决方案。
更确切地说:当调用$model->validate()
(通常与$model->save()
一起调用)时,"safe"属性不起作用。仅在调用$model->load()
时使用。如果你查看SafeValidator类的源代码,你会发现这个验证器没有发生任何事情。验证器不执行任何操作。它只是一个标记(您可能想将其与RequiredValidator等进行比较)。对于load()
,不使用"when"表达式。因此,您可以说"安全"与"何时"不起作用。当对规则进行评估时,可能会使用安全验证器,但其validateAttribute()
为空,因此在该时间点不会发生任何事情。
此外,代码中的whenClient
没有意义。这里应该发生什么?
我想有几种方法可以实现这一点。一个想法是让控制器不通过load()来设置属性,而是显式地设置它们,并在那里检查是否应该设置$model->dhanwantri_bill_number
。或者,您可以使用load(),然后根据$model->bill_type
的设置在加载后恢复属性。
或者,您可以在模型中为dhanwantri_bill_number实现一个setter方法,并在属性是否设置时选择该方法。可能取决于具体情况。
来自Yii2文档:
默认情况下,活动属性被认为是安全的,并且可以进行大规模分配。如果一个属性不应该被大规模分配(因此被认为是不安全的),请在该属性前面加一个感叹号(例如"!rank")。
考虑使用场景来处理您的问题。http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios