Yii2:条件下的安全验证器
Yii2: safe validator on condition
我正在尝试在我的模型中使用此验证规则,但它不起作用。
我的意思是即使 select 其他选项它也总是安全的。
[['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
的安全属性 public 属性
$when - callable - A PHP callable whose return value determines
whether this validator should be applied. yii\validators\Validator
$whenClient - string - A JavaScript function name whose return value
determines whether this validator should be applied on the client
side. yii\validators\Validator
由于 'safe' 验证器只是告诉您可以通过大量赋值来设置属性,因此该方法不合适。它只是说当您使用 load() 方法时,该属性可以获得一个值。如果没有标记为 'safe' 它不会阻止设置一个值,例如$model->dhanwantri_bill_number = 'asdf'
。所以这不是一个合适的解决方案。
更准确地说:当调用 $model->validate()
(通常用 $model->save()
调用)时,'safe' 属性不起作用。它仅在调用 $model->load()
时使用。如果你查看 source code of the SafeValidatior class you see that nothing happens with this validator. The validator doesn't do anything. It is just a marker (you may want to compare it to e.g. RequiredValidator)。并且 load()
不使用 'when' 表达式。所以你可以说 'safe' 不适用于 'when'。评估规则时可能会使用安全验证器,但它的 validateAttribute()
是空的,因此在那个时间点没有任何反应。
此外,您代码中的 whenClient
没有意义。这里应该发生什么?
我想有几种方法可以实现这一点。一种想法是让控制器不通过 load() 设置属性,而是明确设置它们并检查是否应设置 $model->dhanwantri_bill_number
。或者您可以使用 load(),然后根据 $model->bill_type
的设置在加载后恢复属性。
或者您可以在您的模型中为 dhanwantri_bill_number 实现一个 setter 方法,然后选择是否设置该属性。可能取决于场景。
来自 Yii2 文档:
By default, an active attribute is considered safe and can be massively assigned. If an attribute should NOT be massively assigned (thus considered unsafe), please prefix the attribute with an exclamation character (e.g. '!rank').
考虑使用场景来处理您的问题。
http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios
我正在尝试在我的模型中使用此验证规则,但它不起作用。
我的意思是即使 select 其他选项它也总是安全的。
[['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
的安全属性 public 属性$when - callable - A PHP callable whose return value determines whether this validator should be applied. yii\validators\Validator
$whenClient - string - A JavaScript function name whose return value determines whether this validator should be applied on the client side. yii\validators\Validator
由于 'safe' 验证器只是告诉您可以通过大量赋值来设置属性,因此该方法不合适。它只是说当您使用 load() 方法时,该属性可以获得一个值。如果没有标记为 'safe' 它不会阻止设置一个值,例如$model->dhanwantri_bill_number = 'asdf'
。所以这不是一个合适的解决方案。
更准确地说:当调用 $model->validate()
(通常用 $model->save()
调用)时,'safe' 属性不起作用。它仅在调用 $model->load()
时使用。如果你查看 source code of the SafeValidatior class you see that nothing happens with this validator. The validator doesn't do anything. It is just a marker (you may want to compare it to e.g. RequiredValidator)。并且 load()
不使用 'when' 表达式。所以你可以说 'safe' 不适用于 'when'。评估规则时可能会使用安全验证器,但它的 validateAttribute()
是空的,因此在那个时间点没有任何反应。
此外,您代码中的 whenClient
没有意义。这里应该发生什么?
我想有几种方法可以实现这一点。一种想法是让控制器不通过 load() 设置属性,而是明确设置它们并检查是否应设置 $model->dhanwantri_bill_number
。或者您可以使用 load(),然后根据 $model->bill_type
的设置在加载后恢复属性。
或者您可以在您的模型中为 dhanwantri_bill_number 实现一个 setter 方法,然后选择是否设置该属性。可能取决于场景。
来自 Yii2 文档:
By default, an active attribute is considered safe and can be massively assigned. If an attribute should NOT be massively assigned (thus considered unsafe), please prefix the attribute with an exclamation character (e.g. '!rank').
考虑使用场景来处理您的问题。 http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios