2015-03-31 80 views
5

我想在我的模型中使用此验证规则,但它不工作。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

$当 - 赎回 - 一个PHP调用,其返回值决定 这是否确认者应应用。 yii \ validators \ Validator

$ whenClient - string - 一个JavaScript函数名,其返回值为 确定是否应将此验证程序应用于客户端 一侧。验证者

+0

对此属性还有其他规则吗? – topher 2015-04-01 06:29:31

+0

你真的想使用'安全'验证吗? [Doc](http://www.yiiframework.com/doc-2.0/yii-validators-safevalidator.html)表示_SafeValidator充当一个虚拟验证器,其主要目的是标记属性对于大规模赋值是安全的。如果bill_type为'd',你想禁止赋值dhanwantri_bill_number? – robsch 2015-04-01 06:37:42

+0

@robsch - 不,这完全相反 - 如果bill_type为'd',并且在其他情况下不允许'dhanwantri_bill_number',我想允许赋值。 – Pawan 2015-04-01 08:21:17

回答

3

由于'安全'验证程序只是告诉可以通过大量赋值来设置属性,所以这种方法并不适用。它只是说当你使用load()方法时,属性可以得到一个值。如果没有标记为“安全”,则不能防止用例如$model->dhanwantri_bill_number = 'asdf'。所以这不是一个合适的解决方案。

更确切地说:当$model->validate()(通常调用$model->save())被调用时,'安全'属性不起作用。它仅在调用$model->load()时使用。如果你看一下source code of the SafeValidatior类,你会发现这个验证器没有任何反应。验证器不做任何事情。它只是一个标记(您可能想将其与例如RequiredValidator进行比较)。与load()'时'表达式不使用。所以你可以说'安全'不适用'时'。当规则得到评估时,安全验证器可能会被使用,但其validateAttribute()为空,因此在该时间点没有任何反应。

除了代码中的whenClient没有意义。这里应该发生什么?

我想有几种方法可以实现这一点。一个想法是让控制器不通过load()来设置属性,而是明确地设置它们,并在那里检查是否应该设置$model->dhanwantri_bill_number。或者你可以使用load(),然后根据设置的$model->bill_type加载后恢复属性。

或者您可以在您的模型中为dhanwantri_bill_number实现一个setter方法,并在该属性被设置或不设置时选择那里。也许情景依赖。

+0

,但文档使用'safe validator'这些公共属性可以用'可调用' - 我已经在我的问题中添加了属性。 – Pawan 2015-04-01 09:29:29

+0

所以'安全'不适用'时',所以我应该假设在文档中提到的是不正确的?正如在文档中清楚地提到'when'可用于'safe' – Pawan 2015-04-01 09:34:53

+0

@Pawan是,'when'在那里。但安全验证器只对load()有效。在加载时,模型只查看哪些属性是验证规则的一部分(所有提到的属性(当前场景的)没有'!'前缀)。它不会评估该步骤中的“何时”表达。这发生在调用模型的validate()方法时。这已经迟到了。 IMO文档缺乏SafeValidator类。 – robsch 2015-04-01 09:37:05