Yii2:条件安全验证器

时间:2015-03-31 20:30:34

标签: php jquery yii2

我正在尝试在我的模型中使用此验证规则,但它无效。

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

[['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 \验证器\验证

2 个答案:

答案 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