Yii2:安全验证器处于状态


Yii2: safe validator on condition

我试图在我的模型中使用这个验证规则,但它不起作用。

我的意思是,即使选择其他选项,它也始终保持安全。

[['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