我试图在我的模型中使用此验证规则,但它不起作用.
我的意思是即使选择其他选项也始终保持安全.
[['dhanwantri_bill_number'], 'safe',
'when' => function($model) {
return $model->bill_type =='d';
},
'whenClient' => "function (attribute, value) {
return $('#opdtestbill-bill_type').val() == 'd';
}"
],
Run Code Online (Sandbox Code Playgroud)
我做错了吗?是否有任何替代解决方案来实现同样的目标.
谢谢.
规则bill_type
就像
[['bill_type'], 'string', 'max' => 20],
[['bill_type','test_name','date'], 'required'],
Run Code Online (Sandbox Code Playgroud)
根据doc 编辑安全属性公共属性
$ when - callable - 一个PHP可调用的,其返回值决定是否应该应用此验证器.警予\验证器\验证
$ whenClient - string - 一个JavaScript函数名,其返回值确定是否应在客户端应用此验证程序.警予\验证器\验证
由于“安全”验证器只是告诉您可以通过大量赋值来设置属性,因此该方法并不合适。它只是说,当您使用load()方法时,属性可以获得一个值。如果没有标记为“安全”,它不会阻止使用例如设置值$model->dhanwantri_bill_number = 'asdf'
。所以这不是一个正确的解决方案。
$model->validate()
更准确地说:当(通常使用)被调用时,“safe”属性不起作用$model->save()
。$model->load()
仅在被调用时使用。如果您查看SafeValidatior类的源代码,您会发现该验证器没有任何反应。验证器不执行任何操作。它只是一个标记(您可能想将它与例如RequiredValidator进行比较)。并且load()
不使用'when'表达式。所以你可以说'safe' 不适用于 'when'。当规则被评估时,可能会使用安全验证器,但它validateAttribute()
是空的,因此在该时间点什么也没有发生。
除此之外,whenClient
您的代码中的 没有意义。这里应该发生什么?
我想有几种方法可以实现这一点。一种想法是让控制器不通过 load() 设置属性,而是显式设置它们并检查是否$model->dhanwantri_bill_number
应该设置。或者您可以使用 load() ,然后根据设置的内容在加载后恢复属性$model->bill_type
。
或者,您可以在模型中为 dhanwantri_bill_number 实现一个 setter 方法,并在该方法中选择是否设置该属性。也许取决于场景。
归档时间: |
|
查看次数: |
4283 次 |
最近记录: |